VBA
Automatyzacja lub korzystanie z innych aplikacji Biblioteki
Szukaj…
Wprowadzenie
Jeśli używasz obiektów w innych aplikacjach jako części aplikacji Visual Basic, możesz chcieć ustanowić odwołanie do bibliotek obiektów tych aplikacji. Ta dokumentacja zawiera listę, źródła i przykłady korzystania z bibliotek różnych programów, takich jak Windows Shell, Internet Explorer, XML HttpRequest i inne.
Składnia
- expression.CreateObject (ObjectName)
- wyrażenie; Wymagany. Wyrażenie zwracające obiekt Application.
- Nazwa_obiektu; Wymagany ciąg. Nazwa klasy obiektu do utworzenia. Aby uzyskać informacje o prawidłowych nazwach klas, zobacz Identyfikatory programowe OLE.
Uwagi
Gdy aplikacja obsługuje automatyzację, do obiektów, które eksponuje, można uzyskać dostęp za pomocą Visual Basic. Używaj Visual Basic do manipulowania tymi obiektami poprzez wywoływanie metod na obiekcie lub uzyskiwanie i ustawianie właściwości obiektu.
Jeśli używasz obiektów w innych aplikacjach jako części aplikacji Visual Basic, możesz chcieć ustanowić odwołanie do bibliotek obiektów tych aplikacji. Aby to zrobić, musisz najpierw upewnić się, że aplikacja udostępnia bibliotekę obiektów.
Umożliwia wybranie obiektów innej aplikacji, które mają być dostępne w kodzie, poprzez ustawienie odwołania do biblioteki obiektów tej aplikacji.
Tworzy obiekt automatyzacji określonej klasy. Jeśli aplikacja już działa, CreateObject utworzy nową instancję.
Wyrażenia regularne VBScript
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
Narzędzia> Referencje> Wyrażenia regularne Microsoft VBScript #. #
Skojarzona biblioteka DLL: VBScript.dll
Źródło: Internet Explorer 1.0 i 5.5
- MSDN-Microsoft rozwija VBScript za pomocą wyrażeń regularnych
- Składnia wyrażeń regularnych MSDN (skrypty)
- wymiana ekspertów - używanie wyrażeń regularnych w Visual Basic for Applications i Visual Basic 6
- Jak używać wyrażeń regularnych (Regex) w programie Microsoft Excel zarówno w komórkach, jak i w pętlach w SO.
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI-wyrażenie regularne
Kod
Możesz użyć tej funkcji, aby uzyskać wyniki RegEx, połączyć wszystkie dopasowania (jeśli więcej niż 1) w 1 łańcuch i wyświetlić wynik w komórce programu 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
Obiekt systemu plików skryptów
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
Narzędzia> Referencje> Środowisko wykonawcze skryptów Microsoft
Skojarzona biblioteka DLL: ScrRun.dll
Źródło: system operacyjny Windows
MSDN-Accessing Files with FileSystemObject
Model File System Object (FSO) zapewnia narzędzie obiektowe do pracy z folderami i plikami. Pozwala używać znanej składni object.method z bogatym zestawem właściwości, metod i zdarzeń do przetwarzania folderów i plików. Możesz także zastosować tradycyjne instrukcje i polecenia języka Visual Basic.
Model FSO umożliwia aplikacji tworzenie, modyfikowanie, przenoszenie i usuwanie folderów lub ustalanie, czy i gdzie istnieją określone foldery. Umożliwia także uzyskiwanie informacji o folderach, takich jak ich nazwy i data ich utworzenia lub ostatniej modyfikacji.
Tematy MSDN-FileSystemObject : „ ... wyjaśnić koncepcję FileSystemObject i jak z niej korzystać. ” Exceltrick-FileSystemObject w VBA - wyjaśnione
Scripting.FileSystemObject
Obiekt Scripting Dictionary
Set dict = CreateObject("Scripting.Dictionary")
Narzędzia> Referencje> Środowisko wykonawcze skryptów Microsoft
Skojarzona biblioteka DLL: ScrRun.dll
Źródło: system operacyjny Windows
Obiekt Scripting.Dictionary
Obiekt MSDN-Dictionary
Obiekt Internet Explorer
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
Narzędzia> Referencje> Kontrolki internetowe Microsoft
Skojarzona biblioteka DLL: ieframe.dll
Źródło: przeglądarka Internet Explorer
Kontroluje wystąpienie programu Windows Internet Explorer poprzez automatyzację.
Podstawowi członkowie programu Internet Explorer Objec
Poniższy kod powinien przedstawić, jak działa obiekt IE i jak nim manipulować za pomocą VBA. Zalecam przejście przez to, w przeciwnym razie może wystąpić błąd podczas wielu nawigacji.
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
Skrobanie stron internetowych
Najczęstszą rzeczą związaną z IE jest zeskrobanie niektórych informacji na stronie internetowej lub wypełnienie formularza strony i przesłanie informacji. Zobaczymy, jak to zrobić.
Rozważmy kod źródłowy 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>
Możemy użyć kodu jak poniżej, aby uzyskać i ustawić informacje:
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
Co się dzieje? Kluczowym graczem jest tutaj .Document , czyli kod źródłowy HTML. Możemy zastosować pewne zapytania, aby uzyskać pożądane Kolekcje lub Obiekt.
Na przykład IE.Document.GetElementsByTagName("title")(0).innerHtml
. GetElementsByTagName
zwraca kolekcję elementów HTML, które mają znacznik „ title ”. W kodzie źródłowym jest tylko jeden taki znacznik. Kolekcja oparta jest na 0. Aby uzyskać pierwszy element, dodajemy (0)
. Teraz w naszym przypadku chcemy tylko innerHtml
(ciąg innerHtml
), a nie sam obiekt elementu. Określamy więc pożądaną właściwość.
Kliknij
Aby skorzystać z linku na stronie, możemy użyć wielu metod:
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 lub IE Best friend
Aby maksymalnie wykorzystać kod HTML ładowany do IE, możesz (lub powinieneś) skorzystać z innej biblioteki, np. Microsoft HTML Object Library . Więcej na ten temat w innym przykładzie.
IE Główne problemy
Głównym problemem w IE jest sprawdzenie, czy strona została załadowana i jest gotowa do interakcji. Do While... Loop
pomaga, ale nie jest niezawodna.
Również używanie IE tylko do zeskrobywania treści HTML jest OVERKILL. Dlaczego? Ponieważ przeglądarka jest przeznaczona do przeglądania, tj. Wyświetlania strony internetowej ze wszystkimi CSS, JavaScript, obrazkami, wyskakującymi oknami itp. Jeśli potrzebujesz tylko surowych danych, rozważ inne podejście. Np. Używając XML HTTPRequest . Więcej na ten temat w innym przykładzie.