VBAによるIE操作で宅配便の配送状況を検索してみます。
おそらくブラウザ操作で一番ニーズがあるのではないでしょうか。
'sleep関数を使うため。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
'↑ここから上をsubの上に張り付け
Sub ヤマトテスト()
'Microsoft HTML Object Libraryの参照設定必要
'Microsoft Internet Controlsの参照設定必要
Dim IEオブジェクト As Object
Dim htmldoc As HTMLDocument
Dim タグオブジェクト As Object 'タグのオブジェクトを入れる
Dim テーブルオブジェクト As Object 'テーブルのオブジェクトを入れる
Dim x As Long
Dim y As Long
Dim 値 As String
Set IEオブジェクト = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトをセット
IEオブジェクト.Visible = True 'IEを表示する
Sleep 500 '1000で1秒待機
IEオブジェクト.Navigate "http://toi.kuronekoyamato.co.jp/cgi-bin/tneko"
Sleep 1000
DoEvents '読み込み待ち待機。
Do While IEオブジェクト.Busy = True Or IEオブジェクト.ReadyState <> 4
DoEvents
Sleep 100
Loop
Sleep 100
DoEvents
Set htmldoc = IEオブジェクト.Document
htmldoc.getElementById("number01").Value = "1111111" '伝票番号を入力
htmldoc.getElementById("number02").Value = "2222222"
htmldoc.getElementById("number03").Value = "3333333"
htmldoc.getElementById("number04").Value = "4444444"
htmldoc.getElementById("number05").Value = "5555555"
htmldoc.getElementById("number06").Value = "6666666"
htmldoc.getElementById("number07").Value = "7777777"
htmldoc.getElementById("number08").Value = "8888888"
htmldoc.getElementById("number09").Value = "9999999"
htmldoc.getElementById("number10").Value = "0000000"
'少し待機
Sleep 100
DoEvents
Sleep 2000
'検索ボタンを押す
For Each タグオブジェクト In IEオブジェクト.Document.getElementsByTagName("input")
If InStr(タグオブジェクト.outerHTML, "sch") > 0 Then
タグオブジェクト.Click 'ボタンクリック
'ループ脱出
Exit For
End If
Next
Sleep 2000
'読み込み待ち
Do While IEオブジェクト.Busy = True Or IEオブジェクト.ReadyState <> 4
DoEvents
Sleep 100
Loop
'読み込み待ち完了
Set テーブルオブジェクト = IEオブジェクト.Document.getElementsByTagName("TABLE")(Val(5))
For y = 0 To テーブルオブジェクト.Rows.Length - 1 '行のループ
For x = 0 To テーブルオブジェクト.Rows(y).Cells.Length - 1 '列のループ
'一つのセルに3万文字しか入らないため、それ以降を削除する。
値 = Left(テーブルオブジェクト.Rows(y).Cells(x).innerText, 30000)
Sheets(1).Cells(y + 1, x + 1) = 値
Next
Next
'IEを閉じる
IEオブジェクト.Quit
Set IEオブジェクト = Nothing
End Sub
このように10件検索され、
このようにエクセルの一番左のシートに貼り付けられたら完了です。
今回は伝票番号をダミーとしていますし、実際に業務で使うためにはループの処理を入れ、数百件連続して検索できるようにする必要があると思います。
詳細をご説明します。
Set htmldoc = IEオブジェクト.Document
htmldoc.getElementById("number01").Value = "1111111"
この部分が伝票番号を入力する部分です。"number01"という名前の入力ボックスに伝票番号を入力しています。
ご説明した開発者モードでname、もしくはidを調べます。この構文ではnameでもidでもどちらでも構いません。
'検索ボタンを押す
For Each タグオブジェクト In IEオブジェクト.Document.getElementsByTagName("input")
If InStr(タグオブジェクト.outerHTML, "sch") > 0 Then
タグオブジェクト.Click 'ボタンクリック
'ループ脱出
Exit For
End If
Next
ここが検索ボタンを押す部分です。
問い合わせ開始ボタンの上で右クリック、nameがschだとわかりました。
今回はヤマトさんでしたが、他社のサイトも同様に解析可能です。
Set テーブルオブジェクト = IEオブジェクト.Document.getElementsByTagName("TABLE")(Val(5))
For y = 0 To テーブルオブジェクト.Rows.Length - 1 '行のループ
For x = 0 To テーブルオブジェクト.Rows(y).Cells.Length - 1 '列のループ
'一つのセルに3万文字しか入らないため、それ以降を削除する。
値 = Left(テーブルオブジェクト.Rows(y).Cells(x).innerText, 30000)
Sheets(1).Cells(y + 1, x + 1) = 値
Next
Next
この部分。少し難しいですね。ブラウザ内で表状のデータを探し。一番左のシートの(1,1)のセルを始点として貼り付ける、というのもです。
この構文はかなり万能で、大抵のWEBサイトから情報を取り込むことが可能です。
空なくとも。他の運送会社のHPでも使えます。
変更する必要があるのは
("TABLE")(Val(5))
の部分です。
ここで5という数字はテーブルの番号で。0から始まる整数になります(0,1,2,3・・・)。サイトではたまたま5だっただけで。他のサイトでは違う数字になります。
ここをどうやって調べるかですが、一番簡単な方法はゼロ、1、2と順番に試す方法です。
ちょっとカッコ悪いですが、意外なほど簡単にWEBサイトからデータを取り出せます。
Sheets(1).Cells(y + 1, x + 1) = 値
これが抜き出した値を貼り付けるシートと、貼り付け開始位置です。
エクセルVBAが得意な方なら、値をエクセルに取り込めさえすればあとは簡単に編集できるのではないでしょうか。
Comments