VBA
オートメーションまたは他のアプリケーションライブラリの使用
サーチ…
前書き
Visual Basicアプリケーションの一部として他のアプリケーションのオブジェクトを使用する場合は、それらのアプリケーションのオブジェクトライブラリへの参照を設定することができます。このドキュメントでは、Windowsシェル、Internet Explorer、XML HttpRequestなどのさまざまなソフトウェアのライブラリを使用する方法のリスト、ソース、および例を示します。
構文
- expression.CreateObject(ObjectName)
- 発現;必須。 Applicationオブジェクトを返す式。
- ObjectName;必須の文字列。作成するオブジェクトのクラス名。有効なクラス名の詳細については、「OLEプログラム識別子」を参照してください。
備考
アプリケーションがオートメーションをサポートする場合、アプリケーションが公開するオブジェクトにはVisual Basicによってアクセスできます。 Visual Basicを使用して、オブジェクトのメソッドを呼び出すか、オブジェクトのプロパティを取得して設定して、これらのオブジェクトを操作します。
Visual Basicアプリケーションの一部として他のアプリケーションのオブジェクトを使用する場合は、それらのアプリケーションのオブジェクトライブラリへの参照を設定することができます。これを行うには、まずアプリケーションがオブジェクトライブラリを提供していることを確認する必要があります。
そのアプリケーションのオブジェクトライブラリへの参照を設定することにより、コードで使用可能な別のアプリケーションのオブジェクトを選択することができます。
指定されたクラスのAutomationオブジェクトを作成します。アプリケーションがすでに実行されている場合、CreateObjectは新しいインスタンスを作成します。
VBScriptの正規表現
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
ツール>リファレンス> Microsoft VBScript正規表現#。#
関連付けられたDLL:VBScript.dll
ソース:Internet Explorer 1.0および5.5
- MSDN-Microsoft、正規表現でVBScriptを強化
- MSDN-正規表現の構文(スクリプト)
- expert-exchange - Visual Basic for ApplicationsおよびVisual Basic 6での正規表現の使用
- Microsoft Excelの正規表現(Regex)をセル内とループ上の両方で使用する方法
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI-正規表現
コード
この関数を使用してRegExの結果を取得し、すべての一致(1つ以上の場合)を1つの文字列に連結し、結果を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
スクリプトファイルシステムオブジェクト
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
ツール>参照情報> Microsoft Scripting Runtime
関連付けられたDLL:ScrRun.dll
ソース:Windows OS
MSDN - FileSystemObjectを使用したファイルへのアクセス
ファイルシステムオブジェクト(FSO)モデルは、フォルダとファイルを操作するためのオブジェクトベースのツールを提供します。使い慣れたobject.method構文を使用して、豊富なプロパティ、メソッド、およびイベントのセットを使用して、フォルダやファイルを処理できます。従来のVisual Basicのステートメントとコマンドを使用することもできます。
FSOモデルは、アプリケーションにフォルダの作成、変更、移動、削除、または特定のフォルダが存在するかどうか、およびその場所の特定を可能にします。また、フォルダの名前や作成日や最終更新日など、フォルダに関する情報を取得することもできます。
MSDN-FileSystemObjectのトピック :「 ... FileSystemObject の概念とその使い方を説明してください 」 exceltrick-FileSystemObject in VBA - 説明
Scripting.FileSystemObject
スクリプト辞書オブジェクト
Set dict = CreateObject("Scripting.Dictionary")
ツール>参照情報> Microsoft Scripting Runtime
関連付けられたDLL:ScrRun.dll
ソース:Windows OS
Scripting.Dictionaryオブジェクト
MSDN辞書オブジェクト
Internet Explorerオブジェクト
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
ツール>参照情報> Microsoftインターネットコントロール
関連するDLL:ieframe.dll
ソース:Internet Explorerブラウザ
オートメーションによってWindows Internet Explorerのインスタンスを制御します。
Internet Explorer Objecの基本メンバー
以下のコードは、IEオブジェクトがどのように動作するのか、VBAを使ってIEオブジェクトを操作する方法を紹介します。私はそれをステップ実行することをお勧めします。そうしないと、複数のナビゲーション中にエラーが発生する可能性があります。
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スクレイピング
IEで行う最も一般的なことは、ウェブサイトの情報を掻き集めるか、ウェブサイトのフォームを記入して情報を提出することです。それをどうやって行うかを見ていきます。
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>
情報を取得したり設定したりするには、次のようなコードを使用できます。
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
何が起こっている?ここで重要なプレーヤーはHTMLソースコードである.Documentです。いくつかのクエリを適用して、必要なコレクションまたはオブジェクトを取得することができます。
たとえば、 IE.Document.GetElementsByTagName("title")(0).innerHtml
です。 GetElementsByTagName
は、 " title "タグを持つHTML要素のコレクションを返します。このようなタグはソースコード内に1つしかありません。 コレクションは0ベースです。したがって、最初の要素を取得するには(0)
を追加します。ここでは、Elementオブジェクト自体ではなく、 innerHtml
(String)だけを必要としています。そこで、私たちが望むプロパティを指定します。
クリック
サイトのリンクをたどるには、複数の方法があります:
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またはIEベストフレンド
IEにロードされるHTMLを最大限に活用するには、 Microsoft HTML Object Libraryなどの別のライブラリを使用できます(または使用する必要があります)。別の例でこれについてもっと詳しく。
IEの主な問題
IEの主な問題は、ページが読み込まれ、対話する準備ができていることを確認することです。 Do While... Loop
は役に立ちますが、信頼性がありません。
また、IEを使用してHTMLコンテンツをスクラップするのはOVERKILLです。どうして?ブラウザはブラウズ、つまりすべてのCSS、JavaScript、ピクチャ、ポップアップなどでWebページを表示するためのものです。生データのみが必要な場合は、異なるアプローチを検討してください。たとえば、 XML HTTPRequestを使用します 。別の例でこれについてもっと詳しく。