VBA
Automazione o utilizzo di altre applicazioni Librerie
Ricerca…
introduzione
Se si utilizzano gli oggetti in altre applicazioni come parte dell'applicazione Visual Basic, è possibile che si desideri stabilire un riferimento alle librerie di oggetti di tali applicazioni. Questa documentazione fornisce un elenco, fonti ed esempi su come utilizzare le librerie di diversi software, come Windows Shell, Internet Explorer, XML HttpRequest e altri.
Sintassi
- expression.CreateObject (ObjectName)
- espressione; Necessario. Un'espressione che restituisce un oggetto Application.
- ObjectName; Stringa richiesta. Il nome della classe dell'oggetto da creare. Per informazioni sui nomi di classi validi, vedere Identificatori programmatici OLE.
Osservazioni
Quando un'applicazione supporta l'automazione, gli oggetti a cui espone l'applicazione sono accessibili da Visual Basic. Utilizzare Visual Basic per manipolare questi oggetti richiamando metodi sull'oggetto o ottenendo e impostando le proprietà dell'oggetto.
Se si utilizzano gli oggetti in altre applicazioni come parte dell'applicazione Visual Basic, è possibile che si desideri stabilire un riferimento alle librerie di oggetti di tali applicazioni. Prima di poterlo fare, devi prima essere sicuro che l'applicazione fornisca una libreria di oggetti.
Consente di selezionare gli oggetti di un'altra applicazione che si desidera rendere disponibili nel codice impostando un riferimento alla libreria di oggetti dell'applicazione.
Crea un oggetto di automazione della classe specificata. Se l'applicazione è già in esecuzione, CreateObject creerà una nuova istanza.
VBScript Regular Expressions
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
Strumenti> Riferimenti> Microsoft VBScript Regular Expressions #. #
DLL associata: VBScript.dll
Fonte: Internet Explorer 1.0 e 5.5
- MSDN-Microsoft Beefs Up VBScript con espressioni regolari
- Sintassi delle espressioni regolari MSDN (Scripting)
- scambio di esperti: utilizzo delle espressioni regolari in Visual Basic, Applications Edition e Visual Basic 6
- Come utilizzare Regular Expressions (Regex) in Microsoft Excel sia in-cell che loop su SO.
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI: espressione regolare
Codice
È possibile utilizzare queste funzioni per ottenere risultati RegEx, concatenare tutte le corrispondenze (se più di 1) in 1 stringa e visualizzare i risultati nella cella excel.
Public Function getRegExResult(ByVal SourceString As String, Optional ByVal RegExPattern As String = "\d+", _
Optional ByVal isGlobalSearch As Boolean = True, Optional ByVal isCaseSensitive As Boolean = False, Optional ByVal Delimiter As String = ";") As String
Static RegExObject As Object
If RegExObject Is Nothing Then
Set RegExObject = createVBScriptRegExObject
End If
getRegExResult = removeLeadingDelimiter(concatObjectItems(getRegExMatches(RegExObject, SourceString, RegExPattern, isGlobalSearch, isCaseSensitive), Delimiter), Delimiter)
End Function
Private Function getRegExMatches(ByRef RegExObj As Object, _
ByVal SourceString As String, ByVal RegExPattern As String, ByVal isGlobalSearch As Boolean, ByVal isCaseSensitive As Boolean) As Object
With RegExObj
.Global = isGlobalSearch
.IgnoreCase = Not (isCaseSensitive) 'it is more user friendly to use positive meaning of argument, like isCaseSensitive, than to use negative IgnoreCase
.Pattern = RegExPattern
Set getRegExMatches = .Execute(SourceString)
End With
End Function
Private Function concatObjectItems(ByRef Obj As Object, Optional ByVal DelimiterCustom As String = ";") As String
Dim ObjElement As Variant
For Each ObjElement In Obj
concatObjectItems = concatObjectItems & DelimiterCustom & ObjElement.Value
Next
End Function
Public Function removeLeadingDelimiter(ByVal SourceString As String, ByVal Delimiter As String) As String
If Left$(SourceString, Len(Delimiter)) = Delimiter Then
removeLeadingDelimiter = Mid$(SourceString, Len(Delimiter) + 1)
End If
End Function
Private Function createVBScriptRegExObject() As Object
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp") 'ex.: createVBScriptRegExObject.Pattern
End Function
Scripting File System Object
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
Strumenti> Riferimenti> Runtime di Microsoft Scripting
DLL associata: ScrRun.dll
Fonte: sistema operativo Windows
MSDN-Accesso ai file con FileSystemObject
Il modello File System Object (FSO) fornisce uno strumento basato su oggetti per lavorare con cartelle e file. Consente di utilizzare la nota sintassi object.method con un ricco set di proprietà, metodi ed eventi per elaborare cartelle e file. È anche possibile utilizzare le istruzioni e i comandi Visual Basic tradizionali.
Il modello FSO offre alla tua applicazione la possibilità di creare, modificare, spostare ed eliminare cartelle o per determinare se e dove esistono cartelle particolari. Consente inoltre di ottenere informazioni sulle cartelle, come i loro nomi e la data in cui sono state create o modificate per ultime.
Argomenti MSDN-FileSystemObject : " ... spiega il concetto di FileSystemObject e come usarlo. " Exceltrick-FileSystemObject in VBA - Explained
Scripting.FileSystemObject
Oggetto del dizionario di scripting
Set dict = CreateObject("Scripting.Dictionary")
Strumenti> Riferimenti> Runtime di Microsoft Scripting
DLL associata: ScrRun.dll
Fonte: sistema operativo Windows
Scripting. Oggetto letterario
MSDN-Dictionary Object
Internet Explorer Object
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
Strumenti> Riferimenti> Microsoft Internet Controls
DLL associata: ieframe.dll
Fonte: browser Internet Explorer
Controlla un'istanza di Windows Internet Explorer tramite l'automazione.
Internet Explorer Objec Basic Members
Il codice seguente dovrebbe illustrare come funziona l'oggetto IE e come manipolarlo tramite VBA. Vi consiglio di superarlo, altrimenti potrebbe verificarsi un errore durante più navigazioni.
Sub IEGetToKnow()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True 'Sets or gets a value that indicates whether the object is visible or hidden.
'Navigation
.Navigate2 "http://www.example.com" 'Navigates the browser to a location that might not be expressed as a URL, such as a PIDL for an entity in the Windows Shell namespace.
Debug.Print .Busy 'Gets a value that indicates whether the object is engaged in a navigation or downloading operation.
Debug.Print .ReadyState 'Gets the ready state of the object.
.Navigate2 "http://www.example.com/2"
.GoBack 'Navigates backward one item in the history list
.GoForward 'Navigates forward one item in the history list.
.GoHome 'Navigates to the current home or start page.
.Stop 'Cancels a pending navigation or download, and stops dynamic page elements, such as background sounds and animations.
.Refresh 'Reloads the file that is currently displayed in the object.
Debug.Print .Silent 'Sets or gets a value that indicates whether the object can display dialog boxes.
Debug.Print .Type 'Gets the user type name of the contained document object.
Debug.Print .Top 'Sets or gets the coordinate of the top edge of the object.
Debug.Print .Left 'Sets or gets the coordinate of the left edge of the object.
Debug.Print .Height 'Sets or gets the height of the object.
Debug.Print .Width 'Sets or gets the width of the object.
End With
IE.Quit 'close the application window
End Sub
Raschiatura del web
La cosa più comune da fare con IE è di carpire alcune informazioni di un sito Web, o compilare un modulo di sito Web e inviare informazioni. Vedremo come farlo.
Prendiamo in considerazione il codice sorgente di esempio.com :
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style ... </style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
Possiamo usare il codice come sotto per ottenere e impostare le informazioni:
Sub IEWebScrape1()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True
.Navigate2 "http://www.example.com"
'we add a loop to be sure the website is loaded and ready.
'Does not work consistently. Cannot be relied upon.
Do While .Busy = True Or .ReadyState <> READYSTATE_COMPLETE 'Equivalent = .ReadyState <> 4
' DoEvents - worth considering. Know implications before you use it.
Application.Wait (Now + TimeValue("00:00:01")) 'Wait 1 second, then check again.
Loop
'Print info in immediate window
With .Document 'the source code HTML "below" the displayed page.
Stop 'VBE Stop. Continue line by line to see what happens.
Debug.Print .GetElementsByTagName("title")(0).innerHtml 'prints "Example Domain"
Debug.Print .GetElementsByTagName("h1")(0).innerHtml 'prints "Example Domain"
Debug.Print .GetElementsByTagName("p")(0).innerHtml 'prints "This domain is established..."
Debug.Print .GetElementsByTagName("p")(1).innerHtml 'prints "<a href="http://www.iana.org/domains/example">More information...</a>"
Debug.Print .GetElementsByTagName("p")(1).innerText 'prints "More information..."
Debug.Print .GetElementsByTagName("a")(0).innerText 'prints "More information..."
'We can change the localy displayed website. Don't worry about breaking the site.
.GetElementsByTagName("title")(0).innerHtml = "Psst, scraping..."
.GetElementsByTagName("h1")(0).innerHtml = "Let me try something fishy." 'You have just changed the local HTML of the site.
.GetElementsByTagName("p")(0).innerHtml = "Lorem ipsum........... The End"
.GetElementsByTagName("a")(0).innerText = "iana.org"
End With '.document
.Quit 'close the application window
End With 'ie
End Sub
Cosa sta succedendo? Il giocatore chiave qui è il documento . Questo è il codice sorgente HTML. Possiamo applicare alcune query per ottenere le collezioni o l'oggetto che vogliamo.
Ad esempio, IE.Document.GetElementsByTagName("title")(0).innerHtml
. GetElementsByTagName
restituisce una raccolta di elementi HTML, che hanno il tag " title ". C'è solo un tag di questo tipo nel codice sorgente. La raccolta è basata su 0. Quindi per ottenere il primo elemento aggiungiamo (0)
. Ora, nel nostro caso, vogliamo solo innerHtml
(a String), non l'Oggetto Element stesso. Quindi specifichiamo la proprietà che vogliamo.
Clic
Per seguire un collegamento su un sito, possiamo utilizzare più metodi:
Sub IEGoToPlaces()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True
.Navigate2 "http://www.example.com"
Stop 'VBE Stop. Continue line by line to see what happens.
'Click
.Document.GetElementsByTagName("a")(0).Click
Stop 'VBE Stop.
'Return Back
.GoBack
Stop 'VBE Stop.
'Navigate using the href attribute in the <a> tag, or "link"
.Navigate2 .Document.GetElementsByTagName("a")(0).href
Stop 'VBE Stop.
.Quit 'close the application window
End With
End Sub
Microsoft HTML Object Library o IE Migliore amico
Per ottenere il massimo dall'HTML che viene caricato nell'IE, è possibile (o dovrebbe) utilizzare un'altra libreria, ad es. Microsoft HTML Object Library . Maggiori informazioni su questo in un altro esempio.
IE principali problemi
Il problema principale con IE è verificare che la pagina sia stata caricata ed è pronta per essere interagita con. Il Do While... Loop
aiuta, ma non è affidabile.
Inoltre, usare IE solo per raschiare il contenuto HTML è OVERKILL. Perché? Poiché il browser è pensato per la navigazione, ovvero la visualizzazione della pagina Web con tutti i CSS, JavaScript, immagini, popup, ecc. Se sono necessari solo i dati grezzi, prendere in considerazione un approccio diverso. Ad esempio, usando XML HTTPRequest . Maggiori informazioni su questo in un altro esempio.