みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。
前回の記事はこちら。
エクセルVBAのIEクラスにWebページのテーブルデータをシートに書き出すメソッドを追加しました。
さて、今回は少し方向性を変えまして、検索窓へのテキスト入力とボタンクリックをしてみたいと思います。
ということで、エクセルVBAでIEを操作するクラスに検索窓の入力&ボタンクリックのメソッドを追加する方法です。
では、行ってみましょう!
前回のおさらい
では、まずはおさらいから。
IEを操作するクラスIEObjectはこちらです。
Public IE As InternetExplorer
Public Document As HTMLDocument
Private Sub Class_Initialize()
Set IE = New InternetExplorer
IE.Visible = True
End Sub
Private Sub Class_Terminate()
IE.Quit
End Sub
Public Sub Navigate(ByVal url As String)
IE.Navigate url
Wait
Set Document = IE.Document
End Sub
Public Sub Wait()
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Public Sub WriteTableData(ByVal table As HTMLTable, ByVal cell As Range)
Dim i As Long: i = 0
Dim tr As HTMLTableRow
For Each tr In table.getElementsByTagName("tr")
Dim j As Long: j = 0
Dim th As HTMLTableCell
For Each th In tr.getElementsByTagName("th")
cell.Offset(i, j).Value = th.innerText
j = j + 1
Next th
Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
cell.Offset(i, j).Value = td.innerText
j = j + 1
Next td
i = i + 1
Next tr
End Sub
前回作成したのは、WriteTableDataメソッドで、table要素を表すHTMLTableオブジェクトと、書き出しの基点となるRangeオブジェクトを渡すと、テーブルデータをセルに書き出すというものでした(今回の内容で関わるメンバーだけ掲載しています)。
確認用の標準モジュールのSubプロシージャがこちらです。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
.WriteTableData .Document.getElementsByTagName("table")(0), Sheet1.Range("A1")
End With
End Sub
Yahoo!で検索をする機能をクラスに追加する
今回は、「Yahoo!JAPAN」の検索窓から任意の文字列で検索をするという処理を作成していきます。
検索窓は「srchtxt」というidを持つtextタイプのinput要素、検索ボタンは「srchbtn」というidを持つsubmitタイプのinput要素です。
なので
- idで要素を取得して値を入力するメソッド
- idで要素を取得してクリックするメソッド
この2つを作って組み合わせていけば良さそうです。
詳しくは以下記事もご参考くださいませ。
指定のidの要素の値を入力するメソッド
では、まず指定のidの要素にテキストを入力するメソッドからです。
引数としては、要素を特定するためのidと、入力する値をいずれも文字列型で渡します。
Sub InputTextById(ByVal id As String, ByVal keyword As String)
Document.getElementById(id).Value = keyword
End Sub
けっこうシンプルですね。
指定のidの要素をクリックするメソッド
次に、指定のidの要素をクリックするメソッドです。
こちらはクリックするだけなので、引数はidだけですね。
Sub ClickButtonById(ByVal id As String)
Document.getElementById(id).Click
Wait
Set Document = IE.Document
End Sub
クリックすると画面遷移しますので、既にあるWaitメソッドを拝借して読み込み待ちをしています。
また、Documentのセットもします。
Yahoo!検索を行うメソッドの動作確認
では、Yahoo!で検索を行うメソッドの実行確認していきましょう。
以下のSubプロシージャを実行します。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://www.yahoo.co.jp/"
.InputTextById "srchtxt", InputBox("キーワードを入力してください")
.ClickButtonById "srchbtn"
End With
Stop
End Sub
実行すると、まず入力ダイアログが表示されます。
キーワードを入力して「OK」をクリックすると、IEでキーワードの入力とボタンクリックが動作して、以下の検索結果ページが表示されました。
まとめ
以上、エクセルVBAでIEを操作するクラスにYahoo!検索を行う入力&クリックのメソッドを追加する方法をお伝えしました。
なんとなく、入力とクリックを同じメソッドに機能持たせたくなってしまう気もしますが、そこはぐっとこらえて別々にします。
というのも、メソッドは汎用性があるほうが良いので、他のケースでも使えるようにしといたほうがいいんですね。
次回は、ログイン処理をするメソッドの作り方を紹介します。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作するクラスを作る
エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。- エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
- エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
- エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
- エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
- エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
- エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
- エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
- エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する