VBA
Automatisierung oder Verwendung anderer Anwendungsbibliotheken
Suche…
Einführung
Wenn Sie die Objekte in anderen Anwendungen als Teil Ihrer Visual Basic-Anwendung verwenden, möchten Sie möglicherweise einen Verweis auf die Objektbibliotheken dieser Anwendungen einrichten. Diese Dokumentation enthält eine Liste, Quellen und Beispiele für die Verwendung von Bibliotheken verschiedener Software, z. B. Windows Shell, Internet Explorer, XML HttpRequest und andere.
Syntax
- expression.CreateObject (ObjectName)
- Ausdruck; Erforderlich. Ein Ausdruck, der ein Anwendungsobjekt zurückgibt.
- Objektname; Erforderliche Zeichenfolge Der Klassenname des zu erstellenden Objekts. Informationen zu gültigen Klassennamen finden Sie unter Programmierbare OLE-Bezeichner.
Bemerkungen
Wenn eine Anwendung die Automatisierung unterstützt, kann auf die von der Anwendung bereitgestellten Objekte von Visual Basic zugegriffen werden. Verwenden Sie Visual Basic, um diese Objekte zu bearbeiten, indem Sie Methoden für das Objekt aufrufen oder die Eigenschaften des Objekts abrufen und festlegen.
Wenn Sie die Objekte in anderen Anwendungen als Teil Ihrer Visual Basic-Anwendung verwenden, möchten Sie möglicherweise einen Verweis auf die Objektbibliotheken dieser Anwendungen einrichten. Bevor Sie dies tun können, müssen Sie zunächst sicherstellen, dass die Anwendung eine Objektbibliothek bereitstellt.
Ermöglicht das Auswählen von Objekten einer anderen Anwendung, die in Ihrem Code verfügbar sein sollen, indem Sie einen Verweis auf die Objektbibliothek dieser Anwendung festlegen.
Erstellt ein Automatisierungsobjekt der angegebenen Klasse. Wenn die Anwendung bereits läuft, erstellt CreateObject eine neue Instanz.
VBScript-reguläre Ausdrücke
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
Tools> Referenzen> Regelmäßige Microsoft VBScript-Ausdrücke #. #
Zugehörige DLL: VBScript.dll
Quelle: Internet Explorer 1.0 und 5.5
- MSDN-Microsoft verbessert VBScript mit regulären Ausdrücken
- MSDN-Syntax für reguläre Ausdrücke (Skripting)
- Expertenaustausch - Verwenden regulärer Ausdrücke in Visual Basic für Applikationen und Visual Basic 6
- Verwendung von regulären Ausdrücken (Regex) in Microsoft Excel sowohl in der Zelle als auch in Schleifen in SO
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI-regulärer Ausdruck
Code
Sie können diese Funktionen verwenden, um RegEx-Ergebnisse zu erhalten, alle Übereinstimmungen (wenn mehr als 1) in einer Zeichenfolge zu verketten und das Ergebnis in einer Excel-Zelle anzuzeigen.
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
Skript-Dateisystemobjekt
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
Extras> Referenzen> Microsoft Scripting Runtime
Zugehörige DLL: ScrRun.dll
Quelle: Windows-Betriebssystem
MSDN-Zugriff auf Dateien mit FileSystemObject
Das Dateisystemobjektmodell (FSO) bietet ein objektbasiertes Werkzeug zum Arbeiten mit Ordnern und Dateien. Es ermöglicht Ihnen die Verwendung der bekannten object.method-Syntax mit einem umfangreichen Satz von Eigenschaften, Methoden und Ereignissen zum Verarbeiten von Ordnern und Dateien. Sie können auch die herkömmlichen Visual Basic-Anweisungen und -Befehle verwenden.
Mit dem FSO-Modell können Sie mit Ihrer Anwendung Ordner erstellen, ändern, verschieben und löschen oder feststellen, ob und wo bestimmte Ordner vorhanden sind. Außerdem können Sie Informationen zu Ordnern abrufen, z. B. deren Namen und das Datum, an dem sie erstellt oder zuletzt geändert wurden.
MSDN-Filesystem Themen : „... erklären das Konzept des Filesystem und wie es zu benutzen.“ Exceltrick-Filesystem in VBA - Erklärte
Scripting.FileSystemObject
Scripting Dictionary-Objekt
Set dict = CreateObject("Scripting.Dictionary")
Extras> Referenzen> Microsoft Scripting Runtime
Zugehörige DLL: ScrRun.dll
Quelle: Windows-Betriebssystem
Scripting.Dictionary-Objekt
MSDN-Dictionary-Objekt
Internet Explorer-Objekt
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
Extras> Referenzen> Microsoft Internet Controls
Zugehörige DLL: ieframe.dll
Quelle: Internet Explorer-Browser
Steuert eine Instanz von Windows Internet Explorer durch Automatisierung.
Grundlegende Mitglieder des Internet Explorer-Objekts
Der folgende Code sollte einführen, wie das IE-Objekt funktioniert und wie es über VBA bearbeitet wird. Ich empfehle einen Schritt durch, andernfalls kann es bei mehreren Navigationen zu Fehlern kommen.
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
Web Scraping
Die häufigste Sache, die mit IE zu tun ist, ist, einige Informationen einer Website zu kratzen oder ein Website-Formular auszufüllen und Informationen zu übermitteln. Wir werden sehen, wie es geht.
Betrachten wir den Quellcode von example.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>
Wir können Code wie unten verwenden, um Informationen zu erhalten und einzustellen:
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
Was ist los? Der Schlüsselspieler ist hier das .Document , also der HTML-Quellcode. Wir können einige Abfragen durchführen, um die gewünschten Sammlungen oder Objekte zu erhalten.
Zum Beispiel IE.Document.GetElementsByTagName("title")(0).innerHtml
. GetElementsByTagName
gibt eine Sammlung von HTML - Elemente, die den „Titel“ Tag haben. Es gibt nur einen solchen Tag im Quellcode. Die Collection basiert auf 0. Um das erste Element zu erhalten, fügen wir (0)
. In unserem Fall wollen wir nur die innerHtml
(ein String), nicht das Element-Objekt selbst. Wir geben also die gewünschte Eigenschaft an.
Klicken
Um einem Link auf einer Site zu folgen, können wir mehrere Methoden verwenden:
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 oder IE Bester Freund
Um den in den IE geladenen HTML-Code optimal zu nutzen, können (oder sollten) Sie eine andere Bibliothek verwenden, z. B. die Microsoft HTML Object Library . Mehr dazu in einem anderen Beispiel.
IE Hauptprobleme
Das Hauptproblem bei IE besteht darin, zu überprüfen, ob die Seite vollständig geladen wurde und bereit ist, mit ihr zu interagieren. Die Do While... Loop
hilft, ist aber nicht zuverlässig.
Die Verwendung von IE nur zum Abkratzen von HTML-Inhalten ist OVERKILL. Warum? Da der Browser zum Browsen gedacht ist, dh die Webseite mit allen CSS, JavaScripts, Bildern, Popups usw. anzeigen soll. Wenn Sie nur die Rohdaten benötigen, sollten Sie einen anderen Ansatz verwenden. ZB mit XML HTTPRequest . Mehr dazu in einem anderen Beispiel.