WEBには様々なデータが公開されています。そのデータをExcelやそのほかのアプリに取り込んで利用したいことってありますよね。
VBAからインターネット上のデータにアクセスする方法はちょっとググってみればすぐに分かります。
問題はその次ですよね。どうやつて必要なデータのみを取出すか。
今回はその方法についての一例の紹介です。
まずは取り込んだデータを眺めることから始めましょう (^_^)
様々なデータがありますが、大量に整然と整理されているデータは、手作業ではなく、スクリプトやアプリによって生成されています。したがっ
て生成されたHTMLをよく見れば何らかの「規則」が見えてきます。たとえば次のページ抜粋とそのソースコードをみてください。
これは[えきから時刻表]サイト(http://ekikara.jp/)で、茨城県・JR磐線・下りの時刻表を表示させたものの一部です。
ここから「駅名」を取出すにはどうすればいいでしょうか?
元のスクリプトなりアプリのソースコードが分かれば、「規則」はすぐに分かりますが、それは望むべくもありません。しからばどうするか。
「自分で見つけるしかありません。」
あたりまえですね。すみません m(_ _)m
いきなり取り込みプログラムを書かず、データを眺めてみましょう。
「ソースコードを表示」でこの画面のHTMLを表示させてみます。
これの場合には、なんとなく[class="lowBg06"]をまず探して駅名の始まりを見つけ、次に[ href="/../../station/????????.htm">]のような文字列が見つかれば、そのあとに[駅名]がありそうだ と、わかりますよね?もちろん他の部分に[class="lowBg06"]がないかとか、[ href="/../../station/????????.htm">]をどうやって特定するか、文字数でできるか?とかいろいろチェックは必要です。
#なんだかパズルを解くようで楽しくなってきませんか(こんなのが楽しいのは筆者だけですかね)? それはともかく、 指定されたurlから(上記のソースコード画面のようなイメージの)HTMLコードを取得するサブプロシージャの例をあげておきます。ここで取得したコードをもとに上に書いたような「規則」をコーディングしてデータを取出していきます。 Public Function getHTML(url As String, Optional strBody As _ Variant = Null, Optional incharset As String) As String Dim HTTP As Object Dim inStrm As Object Dim res As String Dim pos1 As Long Dim pos2 As Long Dim http_charset As Variant getHTML = "" Set HTTP = CreateObject("MSXML2.XMLHTTP") HTTP.Open "GET", url, False 'false:同期通信 すべての応答が返ってから次へ HTTP.Send '実際に要求を送信 If HTTP.status = 200 Then 'エラーページが返ってくるので常に200 res = HTTP.responseText http_charset = "Shift-JIS" pos1 = InStr(1, res, "charset=", vbTextCompare) If pos1 > 0 Then pos2 = InStr(pos1, res, Chr(34), vbTextCompare) If pos2 > 0 Then http_charset = Replace(Mid(res, pos1, _ pos2 - pos1), "charset=", "", , , _ vbTextCompare) End If End If If Not IsNull(res) Then Set inStrm = CreateObject("ADODB.Stream") With inStrm .Open .Position = 0 .Type = 1 'adTypeBinary .Write HTTP.responseBody 'streamに書き込む .Position = 0 .Type = 2 'adTypeText for .readtext If incharset <> "" Then '文字コードを指定して呼び出したとき .Charset = incharset '文字コードをセット strBody = .readtext ' .Charsetエンコードで読み込んだテキスト Else .Charset = http_charset 'オリジナルの文字コード getHTML = .readtext ' .Charsetエンコードで読み込んだテキスト End If .Close End With Set inStrm = Nothing End If End If Set HTTP = Nothing End Function 'getHTMLを呼び出すプロシージャの例 public sub test() Dim buf as Variant Dim tmp as Variant buf = getHTML(”http://ekikara.jp/newdata/line/1301241_ /down1_1.htm”) If buf = "" Then Exit sub End If tmp = Split(buf, vbLf) '1行ずつに分解してtmpへ入れる '以下「規則」にしたがってtmp()をデコードしていく end sub HTMLを生成するスクリプトやアプリでは対応できないデータというものが存在します。そんなときには手作業で該当データを修正することもあります。規則の「例外」です。 したがって見つけた規則にも例外が発生します。これを予め知ることは、すべてのデータを見ればその場では対応ができますが、元のデータがバージョンアップなどすると、例外の場所も変わってしま います。 「見つかったらすぐ対応」するしかないのでしょうかね?