前回は開いたページから”表示されている文字列”だけを取得するという簡単なツールを作成致しました。
>>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 |
この関数に引数として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 Sub amazonSearch() |
これで操作対象のAmazonのページを開いていても良し。開いていなくても自ら起動してくれる様になりました。
非常にシンプルになりましたね。
次はAmazonのHTMLソースを確認し、検索ワードボックスと検索ボタンの操作を行います。
【次の記事】
⇒VBAでブラウザを操作して作業を自動化してみよう -Amazon検索編 ②-