VBAでブラウザを操作して作業を自動化してみよう -Amazon検索編 ①-


前回は開いたページから”表示されている文字列”だけを取得するという簡単なツールを作成致しました。
>>VBAでブラウザを操作して作業を自動化してみよう -ウェブスクレイピングツール編①-

今回は一歩進んで”入力”、”クリック”といった「操作」を行うツールを作ってみたいと思います。

今回の目標物

今回の目標動作は以下の通りです。

  • VBAを使ってInternetExplorer(以下IE)でAmazon.co.jp(以下Amazon)のページを開く。既にページが開かれている場合は、そのページを利用する。
  • Amazonの検索ボックスに単語を入力する。
  • 検索ボタンを押す。

ここまでの操作を行っていきます。

Amazonのページを取得する

それでは早速エクセルを開いてVBエディターを起動しましょう。

今回からは参照設定などの初期設定は極力省いていきます。確認される場合は前回の記事をご覧下さい。

まずAmazon操作用のメイン関数を作成し、前回同様Amazonサイトの起動まで行う処理を書いてみましょう。

Sub amazonSearch()
    Dim objIE As InternetExplorer   ‘IEオブジェクト
    
    ‘IEの起動
    Set objIE = CreateObject(“InternetExplorer.Application”)
    objIE.Visible = True
    objIE.Navigate2 “https://www.amazon.co.jp/”
End Sub

上記は一例ですが、Amazonのページを開くことができていれば問題ありません。

ではもう一つの処理「既にページが開かれている場合は、そのページを利用する」という処理を足していきますが、毎回メイン関数にIEの起動処理とページの再利用の処理をずらずらと書くのは面倒なので以下の様に関数化します。

‘指定したURLのサイトを返す
Function getTargetUrlIE(url As String) As InternetExplorer
    Dim objIE As InternetExplorer      ‘IE格納
    Dim objSh As Object                ‘shellオブジェクト格納
    Dim objWindow As Object            ‘ウィンドウを格納
    Dim sWindowName As String        ‘ウィンドウタイトルを格納
            
    Set objSh = CreateObject(“Shell.Application”)

    For Each objWindow In objSh.Windows
        On Error Resume Next
        sWindowName = “”
        sWindowName = objWindow.FullName
        On Error GoTo 0
        
        ‘IEウィンドウかどうかの判定
        If LCase(Right(sWindowName, 12)) = “iexplore.exe” Then
        
            ‘URLが指定のものかどうかを判定
            If InStr(objWindow.LocationURL, url) > 0 Then
                Set objIE = objWindow
                Exit For
            End If
        End If
    Next
    
    ‘目的のIEが開かれていない場合は作成する
    If objIE Is Nothing Then
        Set objIE = CreateObject(“InternetExplorer.Application”)
        objIE.Visible = True
        objIE.Navigate2 url
        
        Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
            DoEvents
        Loop
    End If
    
    Set getTargetUrlIE = objIE
End Function

この関数に引数としてURLの文字列を渡すと、現在開かれているIEのページから同じURLを”含む”ものを探し出して返す。指定したURLを含むページが開かれていない場合は、新たにIEを起動してそのページを開く。

という処理を行います。用途に応じて機能(現在開いているものから探す・新規に起動する)を分割し、別々の関数にしても良いと思います。

前半部分が現在開かれているページを取得する処理です。説明としては、今までIEを新規起動する際に使用していた「CreateObject」で「Shell.Application」を生成しています。

このShellオブジェクトに対して「.Windows」の要素をFor~eachでループさせると、現在開かれているIEを取得することができます。複数のタブが開いていた場合でも、指定のタブのみ操作することが可能です。

ただしこの処理で取得できるのはIEだけではありません。そのため、そのページのURLをチェックする前にまずはIEかどうかの判定が必要になります。

それが以下の部分です。

If LCase(Right(objWindowName, 12)) = “iexplore.exe” Then

ここでブレークポイントを入れ、「objWindow.FullName」でどういった値が格納されているのか見てみましょう。

1.C:\Program Files\Internet Explorer\iexplore.exe
2.C:\Windows\Explorer.EXE

最初に出てきた「1」のウィンドウがIEのウィンドウです。実行されているアプリケーションファイル名が取得できていますので、このファイル名部分が「iexplore.exe」かどうかで判定を行います。

「objWindow」の中身がIEウィンドウになっている場合は、IE型(xxx As InternetExplorer)と同じ様にメソッドやプロパティを参照することができます。

今回は「objWindow.LocationURL」を指定してURLを取得していますが、「objWindow.Document.Title」を指定してそのページのタイトルを取得することも可能です。

それでは上記処理を使ったメイン関数を作成しましょう。

Option Explicit

Const READYSTATE_COMPLETE = 4
Const URL_AMAZONJP = “https://www.amazon.co.jp/”

Sub amazonSearch()
    Dim objIE As InternetExplorer
    
    ‘AmazonページIEを取得
    Set objIE = getTargetUrlIE(URL_AMAZONJP)
    
End Sub

これで操作対象のAmazonのページを開いていても良し。開いていなくても自ら起動してくれる様になりました。

非常にシンプルになりましたね。

次はAmazonのHTMLソースを確認し、検索ワードボックスと検索ボタンの操作を行います。

【次の記事】

VBAでブラウザを操作して作業を自動化してみよう -Amazon検索編 ②-

関連記事と広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする