VBA
Automation eller användning av andra applikationer Bibliotek
Sök…
Introduktion
Om du använder objekten i andra applikationer som en del av din Visual Basic-applikation, kanske du vill skapa en referens till objektbiblioteken för dessa applikationer. Denna dokumentation innehåller en lista, källor och exempel på hur man använder bibliotek med olika programvara, som Windows Shell, Internet Explorer, XML HttpRequest och andra.
Syntax
- expression.CreateObject (Object)
- uttryck; Nödvändig. Ett uttryck som returnerar ett applikationsobjekt.
- Object; Obligatorisk sträng. Klassnamnet på objektet som ska skapas. För information om giltiga klassnamn, se OLE Programmatic Identifier.
Anmärkningar
När en applikation stöder automatisering kan de objekt som applikationen exponerar nås av Visual Basic. Använd Visual Basic för att manipulera dessa objekt genom att åberopa metoder på objektet eller genom att få och ställa in objektets egenskaper.
Om du använder objekten i andra applikationer som en del av din Visual Basic-applikation, kanske du vill skapa en referens till objektbiblioteken för dessa applikationer. Innan du kan göra det måste du först vara säker på att applikationen tillhandahåller ett objektbibliotek.
Gör att du kan välja ett annat applikations objekt som du vill ha tillgängligt i din kod genom att ange en referens till applikationens objektbibliotek.
Skapar ett automatiseringsobjekt för den angivna klassen. Om applikationen redan körs kommer CreateObject att skapa en ny instans.
VBScript Regular Expressions
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
Verktyg> Referenser> Microsoft VBScript Regular Expressions #. #
Tillhörande DLL: VBScript.dll
Källa: Internet Explorer 1.0 och 5.5
- MSDN-Microsoft Beefs Up VBScript med regelbundna uttryck
- MSDN-Regular Expression Syntax (Scripting)
- experter-utbyte - Använda vanliga uttryck i Visual Basic för applikationer och Visual Basic 6
- Hur man använder Regular Expressions (Regex) i Microsoft Excel både i cell och slingor på SO.
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI-Regular expression
Koda
Du kan använda dessa funktioner för att få RegEx-resultat, sammanfoga alla matchningar (om fler än 1) i en sträng och visa resultat i excelcell.
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
Skriptfilsystemobjekt
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
Verktyg> Referenser> Microsoft Scripting Runtime
Tillhörande DLL: ScrRun.dll
Källa: Windows OS
MSDN-åtkomst till filer med FileSystemObject
FSO-modellen (File System Object) tillhandahåller ett objektbaserat verktyg för att arbeta med mappar och filer. Det låter dig använda det bekanta syntetxet object.method med en rik uppsättning egenskaper, metoder och händelser för att bearbeta mappar och filer. Du kan också använda de traditionella Visual Basic-uttalandena och kommandona.
FSO-modellen ger din applikation möjlighet att skapa, ändra, flytta och radera mappar eller bestämma om och var specifika mappar finns. Det ger dig också möjlighet att få information om mappar, till exempel deras namn och datum då de skapades eller senast ändrades.
MSDN-FileSystemObject-ämnen : " ... förklara konceptet för FileSystemObject och hur man använder det. " Exceltrick-FileSystemObject i VBA - Förklarat
Scripting.FileSystemObject
Skriptordbokobjekt
Set dict = CreateObject("Scripting.Dictionary")
Verktyg> Referenser> Microsoft Scripting Runtime
Tillhörande DLL: ScrRun.dll
Källa: Windows OS
Scripting.Diction-objekt
MSDN-Dictionary Object
Internet Explorer-objekt
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
Verktyg> Referenser> Microsoft Internet-kontroller
Tillhörande DLL: ieframe.dll
Källa: Internet Explorer Browser
Kontrollerar en instans av Windows Internet Explorer genom automatisering.
Internet Explorer Objec Basic Members
Koden nedan bör introducera hur IE-objektet fungerar och hur man manipulerar det genom VBA. Jag rekommenderar att du går igenom det, annars kan det göra fel under flera navigeringar.
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
Webskrapning
Det vanligaste att göra med IE är att skrapa viss information på en webbplats eller att fylla i ett webbplatsformulär och skicka in information. Vi ska titta på hur vi gör det.
Låt oss överväga exempel.com källkod:
<!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>
Vi kan använda kod som nedan för att få och ställa in information:
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
Vad händer? Den viktigaste spelaren här är. Dokumentet , det är HTML-källkoden. Vi kan tillämpa några frågor för att få de samlingar eller objekt vi vill ha.
Till exempel IE.Document.GetElementsByTagName("title")(0).innerHtml
. GetElementsByTagName
returnerar en samling HTML-element som har taggen " title ". Det finns bara en sådan tagg i källkoden. Samlingen är 0-baserad. Så för att få det första elementet lägger vi till (0)
. I vårt fall vill vi bara ha innerHtml
(en sträng), inte själva elementobjektet. Så vi specificerar den egendom vi vill ha.
Klick
För att följa en länk på en webbplats kan vi använda flera metoder:
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 eller IE Bästa vän
För att få ut det mesta av HTML-koden som laddas in i IE kan du (eller borde) använda ett annat bibliotek, dvs. Microsoft HTML Object Library . Mer om detta i ett annat exempel.
IE Huvudfrågor
Huvudproblemet med IE är att verifiera att sidan laddas och är redo att interagera med. The Do While... Loop
hjälper, men är inte pålitlig.
Att använda IE bara för att skrapa HTML-innehåll är OVERKILL. Varför? Eftersom webbläsaren är avsedd för surfning, dvs att visa webbsidan med alla CSS, JavaScripts, Pictures, Popups, etc. Om du bara behöver rådata, överväg olika tillvägagångssätt. Använd t.ex. XML HTTPRequest . Mer om detta i ett annat exempel.