top of page
執筆者の写真まあさ

宅配便配送状況検索

更新日:2020年2月9日


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


bottom of page