はじめに
仕事や学校の課題などで,以下のような操作を無限にするようなタスクはありませんか?
- Webページにアクセスする
- 検索フォームなどにキーワードを入れる
- その結果をExcelなどに記録する
- 上の操作を繰り返してデータを集める
私の場合,Webのフォームで算出される値をシステムテストの期待値として収集したいということがありました.
100ケース以上のケースがあるため,Webに入力→Excelに転記というのは気が滅入ってしまいます.
「こんなとき,RPAがあればなぁ…(・×・)」と思いましたが,考えてみればVBAで実現できたので,シンプルな実装例を用いてご紹介してみたいと思います.
環境
- Windows 10
- Excel 2010(諸事情で少し古いVersion)
- Internet Explorer 11
今回,実装するケース
王様は民に対して管轄の税務署を知らせて案内状を作りたいようです.
王様「ここにある郵便番号の管轄税務署のリストを作れ!」
ぼく「はい!」
Webフォーム
というわけで,さっそく国税庁のWebサイトにアクセスしてみると,
右下の方に↓こんなフォームがあります.
ここに郵便番号を入れることで,管轄の税務署を調べられそうです.
Excelファイル
王様がくれた郵便番号リストは,以下のような形式になっています.
E列に対して,「○×税務署」と入力していきます.
プログラム
以下のようなプログラムを用意する
VBAコード
sample
Sub IE操作()
'定数の宣言
Const URL = "http://www.nta.go.jp"
Const FIRST_ROW_NUM = 2
'インターネットに接続してブラウザを開く
Dim objIE As InternetExplorer
Set objIE = New InternetExplorerMedium
objIE.Visible = True
'インターネットの特定のページを開く
objIE.navigate URL
Call IEWait(objIE)
Dim condition As Boolean
condition = True
Dim i As Integer
i = FIRST_ROW_NUM
Do While condition
'---郵便番号をExcelから取得して変数に代入
Dim postalCode1, postalCode2
postalCode1 = Mid(Cells(i, 1), 1, 3)
postalCode2 = Mid(Cells(i, 1), 4, 7)
'---IEに自動で文字入力
objIE.document.getElementById("kszc1").Value = postalCode1
objIE.document.getElementById("kszc2").Value = postalCode2
'---ボタンを自動でクリックして次へ---
objIE.document.getElementsByName("kszBtn")(0).Click
Call IEWait(objIE)
'---値を取得する
Dim zeimusho
If IsNull(objIE.document.getElementById("zmsnm1")) Then
Cells(i, 5) = "該当なし"
Else
zeimusho = objIE.document.getElementById("zmsnm1").innerText
Cells(i, 5) = zeimusho
End If
i = i + 1
If i > Cells(1, 1).End(xlDown).Row Then
condition = False
Else
condition = True
End If
objIE.navigate URL
Call IEWait(objIE)
Loop
'IEを閉じる
objIE.Quit
Set objIE = Nothing
End Sub
'---IEを待機する関数---
Function IEWait(ByRef objIE As Object)
Const READYSTATE_COMPLETE = 4
Do While objIE.Busy = True Or objIE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
End Function
ポイント
- ExcelからVisual Basicのエディタを開き「ツール」→「参照設定」から以下の2つにチェックを入れます.
- Microsoft HTML Object Library
- Microsoft Internet Controls
- 郵便番号を3桁/4桁に分割してフォームに入力するため,
postalCode1 = Mid(Cells(i, 1), 1, 3)
Mid関数(文字列をX字目~Y字目まで切り出す)を使います. - HTML要素の操作はJavaScriptにおけるDOM操作に近い.
今回,対象のWebフォームのbutton要素にid属性がなかったため.name属性と添え字(0)を用いています. - 結果ページで該当する税務署がない場合,結果となるHTML要素がないため,IsNullチェックを入れています.
If IsNull(objIE.document.getElementById("zmsnm1")) Then
※省いてしまうとJavaにおける「NullPointerException」が発生する.
実行結果
終わりに
Web APIがない場合で,数百件程度のデータを取得をしたい場合など,活用できるケースは少なくない気がします.