■4-3 Webページに表示されているデータを取得する方法
Webページに表示さている文章や表などを取り込んで、Excelシートに張り付けると、Excelの持っている
機能を使ってデータを解析することができ大変便利です。ここではWebページのデータを取り込む方法
を紹介します。




(1)BodyタグでHTMLファイルの全データを取得
innerHTMLでbody〜bodyタグ内のHTML全文字を取得します。
画面10はデモファイルの「data01.htmファイル」を開いた時の表示例で、画面11は「Bodyタグで
HTMLデータ取得」マクロ実行例です。

画面10 データを取得したHTMLファイル例


画面11 取得したデータ例


以下はHTMLファイルのソースの1部です。
画面10と合わせて見ると、body〜bodyタグ内の全データを取得してことが解ると思います。

なお、表示ソースの一部タグの「<>」は全角に変えてあります。半角でExcelシートに記述すると
テキストックスがシートに記載され消去に苦労します。
消去したい場合は「開発」「挿入」「ActiveXコントロール」の「コマンドボタン」をクリックして対象のシートに
1個コマンドボタンを書いてください。それで書いたボタンも消したい対象のテキストボックスも選択できる
ので、選択して削除します。(Excel2003ではメニューの「表示」「ツールバー」「コントロールツールボックス」
の「コマンドボタン」をクリックとなります)


data01.htmlファイルのタグ例
<BODY>
<font size=4 color=#ff00ff><b>
テキストボックス</b></font>
<hr>
<FORM NAME="Myfn">
テキストボックスの元文字:<br>
テストaAbBaAbBあい123123<br>
<INPUT TYPE="text" NAME="txt" SIZE=47 MAXLENGTH=30
Value="テストaAbBaAbBあい123123">
<br><br>
</BODY>
Dim myobj As Object, objIE As Object
Dim fff As String, mycnt
Dim sanp As Integer
Sub data1()
    fff = ThisWorkbook.Path & "\data01.html"
    sanp = 1
    Call datam
End Sub
--------------------------------------------------------
Sub datam()
Set myobj = CreateObject("Shell.Application")
mycnt = myobj.Windows.Count
 
With myobj.Windows
    Shell ("EXPLORER.EXE " & fff)
        Do
            DoEvents
        Loop Until mycnt + 1 <= .Count
    Set objIE = .Item(mycnt)
End With
 
 Do While objIE.ReadyState <> 4 Or objIE.Busy = True
      DoEvents
 Loop
 
    Select Case sanp
        Case 1
            Call data1a
        Case 2
            Call data2a
    End Select
 
Set objIE = Nothing
Set myobj = Nothing
End Sub
---------------------------------------------------------
Sub data1a()
Dim myhtml As String
    myhtml = objIE.Document.Body.innerHTML
    objIE.Quit
        MsgBox myhtml
End Sub




(2)BodyタグでHTMLファイルの全テキストデータを取得
innerHTMLでbody〜bodyタグ内のテキスト文字を取得します。前述と同じHTMLファイルに対して実行して
結果は画面12となります。

画面12テキストデータ取得例


Sub data2a()
Dim myhtml As String
    myhtml = objIE.Document.Body.innerText
    objIE.Quit
        MsgBox myhtml
End Sub




(3)HTMLファイルのテーブルデータを取得
テーブルにID名が付いている場合そのIDを指定してテーブルのデータ を取得できます。書式は、
getElementById("ID名").innerHTMLとなります。画面13がサンプルHTMLファイルの表示例です。

画面13 サンプルHTMLファイル表示例


以下はHTMLファイルのソースの1部です。

data02.htmlファイルのタグ例
<BODY>
TABLE ID="id33a" を指定。<br>
<TABLE BORDER=1 ID="id3a">
<TR id="id3b"><TD>A1セル </TD><TD>A2セル </TD><TD>A3セル </TD></TR>
<TR><TD>B1セル </TD><TD>B2セル </TD><TD id="id3c">B3セル </TD></TR>
<TR><TD>C1セル </TD><TD>C2セル </TD><TD>C3セル </TD></TR>
</TABLE>
</BODY>


[1]ID名がテーブル全体を指定の例
「TABLE ID="id3a"」を取得の場合は、テーブル内の全データを取得します。
(実行例は画面14参照)
画面14 テーブル全体取得例


Sub data3_1a()
Dim mydat As String
    mydat = objIE.Document.getElementById("id3a").innerHTML
    objIE.Quit
MsgBox "(指定したエレメントIDのデータ)" & Chr(10) & Chr(10) & mydat
End Sub


[2]ID名がテーブルの1行を指定の例
「TR id="id3b"」を取得の場合は、テーブル内で指定の1行データを取得します。
(実行例は画面15参照)
画面15 テーブルの1行を取得例


Sub data3_2a()
Dim mydat As String
    mydat = objIE.Document.getElementById("id3b").innerHTML
        objIE.Quit
MsgBox "(指定したエレメントIDのデータ)" & Chr(10) & Chr(10) & mydat
End Sub


[3]ID名がテーブルの1セルを指定の例
「TD id="id3c"」を取得の場合は、指定の1セルデータを取得します。
(実行例は画面16参照)
画面16 テーブルの1セルを取得例


Sub data3_3a()
Dim mydat As String
    mydat = objIE.Document.getElementById("id3c").innerHTML
        objIE.Quit
MsgBox "(指定したエレメントIDのデータ)" & Chr(10) & Chr(10) & mydat
End Sub


[4]テーブルデータをRows.Cells指定で取得例
テーブルが特定できれば個別セルは、Rows(番号).Cells(番号)を指定で
セルデータを取得できます。
(実行例は画面17参照)

画面17 Rows.Cells指定で取得例


Sub data3_4a()
Dim mydat As String, objTable As Object
 
    Set objTable = objIE.Document.all("id3a")
    mydat = objTable.Rows(2).Cells(1).innerText
objIE.Quit
MsgBox "(指定したRows(2).Cells(1)データ)" & Chr(10) & Chr(10) & mydat
End Sub




(4)HTMLファイルのハイパーリンクを制御する方法
自動化にはハイパーリンクを自動的にクリックするのも重要アイテムです。
アンカータグ<A>で指定したハイパーリンクはエレメント番号はないし、名前がついていないので何番目
のリンクか調べLinks(番号)で制御します。(実行例は画面18参照)
画面18ハイパーリンクの制御例


マクロは、オブジェクト「objIE」設定までは4-2項と同じであり、異なっている
内容のみ記述します。

 
Sub data4a()
    objIE.Document.Links(3).Click
 
End Sub


(5)リンクオブジェクの表題を取得する方法
リンク指定は番号のみで行うので、名前指定と異なり間違いやすいので、重要なボタンをクリックする場合
は内容を確認した方がよい。ボタン内容の取得は通常「innerHTML」でおこないますが、他の取得方法も
知っているとケースバイケースで効率のよい使用方法が出きると共に、他のマクロでHTMLファイルの
ソースを取得する場合も応用できるので、各種方法を合わせて紹介します。

下記は前述の「data4a」プロシージャへリンク名確認を追加した例です。

If objIE.Document.Links(3).innerHTML = "KIの写真展示室" Then
objIE.Document.Links(3).Click
End If


[1]「outerHTML」で取得
指定のHTML要素をタグも含めた内容を取得します。
(実行例は画面19参照)

画面19outerHTMLで取得例


マクロは、4-3節と同じであり、異なっている内容のみ以下に記述します。

Sub data5_1a()
cnt = 1
Cells(cnt, 1).Value = "(1)「outerHTML」で取得": cnt = cnt + 1
For i = 0 To objIE.Document.Links.Length - 1
    Cells(cnt, 1) = "'" & objIE.Document.Links(i).outerHTML
    cnt = cnt + 1
Next i
    objIE.Quit
End Sub


[2]「innerHTML」で取得
指定のHTML要素のタグの間の内容を取得します。(実行例は画面20参照)

画面20innerHTMLで取得例


Sub data5_2a()
cnt = 7
Cells(cnt, 1).Value = "(2)「innerHTML」で取得": cnt = cnt + 1
For i = 0 To objIE.Document.Links.Length - 1
    Cells(cnt, 1) = "'" & objIE.Document.Links(i).innerHTML
    cnt = cnt + 1
Next i
    objIE.Quit
End Sub


[3]「href」で取得
指定のHTML要素のタグの間の内容を取得します。(実行例は画面21参照)

画面21 hrefで取得例


Sub data5_3a()
cnt = 13
Cells(cnt, 1).Value = "(3)「href」で取得": cnt = cnt + 1
For i = 0 To objIE.Document.Links.Length - 1
    Cells(cnt, 1) = "'" & objIE.Document.Links(i).href
    cnt = cnt + 1
Next i
    objIE.Quit
End Sub


[4]「outerText」で取得
指定のHTML要素のタグの間の内容を取得します。(実行例は画面22参照)

画面22 outerTextで取得例


Sub data5_4a()
cnt = 19
Cells(cnt, 1).Value = "(4)「outerText」で取得": cnt = cnt + 1
For i = 0 To objIE.Document.Links.Length - 1
    Cells(cnt, 1) = "'" & objIE.Document.Links(i).outerText
    cnt = cnt + 1
Next i
    objIE.Quit
End Sub




[5]「innerText」で取得
指定のHTML要素のタグの間の内容を取得します。(実行例は画面23参照)

画面23 innerTextで取得例


Sub data5_5a()
cnt = 25
Cells(cnt, 1).Value = "(5)「innerText」で取得": cnt = cnt + 1
For i = 0 To objIE.Document.Links.Length - 1
    Cells(cnt, 1) = "'" & objIE.Document.Links(i).innerText
    cnt = cnt + 1
Next i
    objIE.Quit
End Sub




(6)HTMLソースのみ取得は HTTPオブジェクト使用が効率が良い
前項までに紹介したサンプルは全てインターネットエクスプローラーのオブジェクトで実行しています。
画面に表示することが前提のコントロールであり、たとえ非表示にしたとしても、画像やFlashや
JavaScript をロードするので、多量の画像が埋め込まれたページなどでは処理に時間が掛かります。

しかし、 HTML ソースのみが必要で画像の表示なんて要らないケースもあります。XMLHTTP オブジェクト
を使えばHTML ソースを簡単に取得できす。(XMLHTTP オブジェクトは、その名の通り、Microsoft 社
が XML 対応として 開発したCOM コンポーネントに含まれるオブジェクトです)

[1]HTMLファイルの全データ取り込む方法
画面24は全データを取り込みメッセージボックスへ表示した例です。
ただし単純に、 「responseTextメソッド」で取り込んでもデータが文字化けして使い物になりません。
ExcelVBAの「StrConv関数」で文字列の変換をすれば文字化けも直り上手く実行できます。
なお、文字化けについては、自分のPC上で作成したHTMLファイルは取り込んだデータは文字化けしまし
たが、実際のインターネットからダウンロードしたデータは殆んど文字化けはありませんでした。

画面24 HTTPでHTMLの情報取得例


Sub http1()
Dim fff As String, oHttp As Object, dathaml As String
 
fff = ThisWorkbook.Path & "\data01.html"
 
Set oHttp = CreateObject("Microsoft.XMLHTTP")
oHttp.Open "GET", fff, False
oHttp.Send
dathaml = StrConv(oHttp.responseBody, 64)
 
MsgBox dathaml
Set oHttp = Nothing
 
End Sub


[2]テーブルデータを正規表現で高速取り込む方法
Webページのデータベースは普通テーブルに入っています。大量のデータをダウンロードする場合時間が
掛かりますが、XMLHTTP オブジェクトを使い、正規表現でパターンマッチングで高速でテーブルデータを
取得できます(実行例は画面25参照)。

画面25テーブル内データの取り込み例


Sub http2()
Dim fff As String, oHttp As Object, dthtml As String
Dim stchk As Integer, enchk As Integer, itmsu As Integer
Dim r As Integer, c As Integer, j As Integer
 
fff = ThisWorkbook.Path & "\data02.html"
Set oHttp = CreateObject("Microsoft.XMLHTTP")
    oHttp.Open "GET", fff, False
    oHttp.Send
    dthtml = StrConv(oHttp.responseBody, 64)
 
With CreateObject("VBScript.RegExp")
    .Pattern = ">([^<>]+)<"
    .Global = True
        On Error Resume Next
            stchk = InStr(1, dthtml, "


【参考431】テーブルデータをWebクエリで取得する例
XMLHTTP オブジェクトでデータ取得の項目ですが、XMLHTTP オブジェクトと関係ありませんが、Excelで
Webページのテーブルデータ取得はWebクエリで実行が簡単で一般的であり、ここでWebクエリのマクロ
を紹介します。画面26が対象ファイルで画面27が2個目のテーブルを取り込んだ例です。

画面26 取得対象のHTMLファイル例


画面27 テーブルデータをWebクエリで取得例


Sub webQu1()
Dim fff As String
fff = ThisWorkbook.Path & "\data05.html"
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;" & fff, Destination:=Range("A1"))
 
      .RefreshStyle = xlOverwriteCells
      .WebTables = "2"
      .WebFormatting = xlWebFormattingNone
      .Refresh BackgroundQuery:=False
    End With
End Sub



【戻る】    【Top画面】   【HPへ】