サーチ…


前書き

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

コード

この関数を使用して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ブラウザ

MSDN-InternetExplorerオブジェクト

オートメーションによって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を使用します 。別の例でこれについてもっと詳しく。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow