[三流君] [VBAで楽しく] [VBA IE 操作]

三流君VBA:VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか

概要:

サンプルは株価の表で、TABLEが2重になってました。
そのテーブルを、
     '.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す
     For Each objTAG In objIE.document.getElementsByTagName("TABLE")
        'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
        If InStr(objTAG.InnerText, "終値") > 0 _
なんて感じで識別して、取り込んでみました。

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

関連項目:Webページから表を取り込むサンプル。(別の切り口で)
↑ラフな設計から製造まで[VBA IE操作 表の取り込みサンプル]を見て下さい。
↑の実行サンプルは[↑の小細工した実行サンプル]
(IE_GET_TABLE_0316.zip です。解凍して動かして確認してください)

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか

こんにちは。AB型の変わり者 三流プログラマーのKen3です。

今回は、
IE 操作系でTABLEの中にTABLEタグが存在する、
よくある話にチャレンジしてみます。

/* * 1. 今回のキッカケ */

最近下記の質問をいただく ---- >[No.119 IEを使用して、Web上の表をExcelへ]において、 >頁によっては表以外の記述にもtableタグを多用しているものがありますが、 >欲しい表のみをExcelへ持ってくる方法(tableの見分け方)はありますか? > >具体的には、 >以下の例で試すと、メインの表だけでよいところ、workbookが25個もできました。 >http://table.yahoo.co.jp/t?c=2004&a=10&b=4&f=2005&d=10&e=14&g=d&s=4753.t&y=0&z=4753.t ---- あらら、不必要な表を取得してしまうんですね。 まぁ、レイアウトをきれいにするためにTABLEタグで細工したHTML多いからね。

/* * 2.現象を再現する */

世の中には、いろいろなHTML FORMがあります。 まずは、現象を再現しますか。 No.119 IEを使用して、Web上の表をExcelへ http://www.ken3.org/vba/backno/vba119.html から、 >HTMLの表は、基本のパターンを書くと、 ><TABLE> > <TR> > <TD>XXXXXX</TD> > <TD>YYYYYY</TD> > <TD>ZZZZZZ</TD> > </TR> ></TABLE> >と、 ><TABLE>テーブルのタグから始まり、 ><TR>行の開始 ><TD>列のデータ(<TH>と見出しをキチント書いている人もありです) >の >3つの組み合わせと順番です。 なんて言ってるから、 <TABLE>の中に<TABLE>があると変な処理になるんだよね。 No.119を元に、 URLを変更して、Bookがいっぱいだとうざいのでシートの.addに変えたバージョン
Sub ie_make_table_test()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object  'TAGのオブジェクトを代入
    Dim strURL   As String  'URLの文字列
    Dim y As Integer
    Dim x As Integer
    Dim objTableItem As Object 'TABLE内のITEM検索用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    strURL = "http://table.yahoo.co.jp/"                'ベースURL
    strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10"   '期間
    strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
    objIE.Navigate strURL  'URLへ

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     '新規ブックを追加する
     Workbooks.Add    'No.177で修正ブックを新規に1つ作る
     
     '.body のデータをループする
     For Each objTAG In objIE.document.body.all
        'テーブルのタグを探す
        If objTAG.tagName = "TABLE" Then
            '新規シートを追加する
            Sheets.Add   'No.177で修正、新規シートを作成する
            'カウンタの初期化
            y = 0 '行カウンタ
            'テーブル内のITEMでループする
            For Each objTableItem In objTAG.all
                If objTableItem.tagName = "TR" Then
                    y = y + 1   '行カウンタを+1
                    x = 1 '列カウンタを1(左端にする)
                End If
                If objTableItem.tagName = "TD" Then
                    'テキストデータをセットする
                    Cells(y, x) = objTableItem.innerText
                    x = x + 1 '列カウンタを+1(次にする)
                End If
            Next
        End If
     Next

End Sub
実行すると、うわっ・・・シートがかなりの数出てきたよ・・・ こりゃここからデータをさらに手作業で編集するのはツライなぁ。

/* * 3.テーブルの中の判断可能な項目名(固定なもの)を探す */

URLの先を見ると、 ライブドア、株価・・・ オイオイ、株価のデータ取り込みかよ。 これのサンプル作るとほかにもいろいろと質問来るんだろうなぁと思いつつ、 数あるテーブルの中で、ほしいのは、 日付 始値 高値 安値 終値 出来高 調整後終値* の表なんですよねキット。 そこで、簡単な逃げ手としては、 TABLEタグを見つけたら、その要素の中に終値とか出来高なんて項目があるか、 探してみるのがいいのかなぁ。 要素を1つ1つ探すと大変なので、 手抜きで.InnerTEXTをInStr関数で If InStr(objTAG.InnerText, "終値") > 0 Then ↑こんな感じでTABLEの中をチェックしてみます。
Sub ie_make_table_test()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object  'TAGのオブジェクトを代入
    Dim strURL   As String  'URLの文字列
    Dim strTAGNAME As String  'タグの名前保存用
    Dim y As Integer
    Dim x As Integer
    Dim objTableItem As Object 'TABLE内のITEM検索用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    strURL = "http://table.yahoo.co.jp/"                'ベースURL
    strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10"   '期間
    strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
    objIE.Navigate strURL  'URLへ

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     '新規ブックを追加する
     Workbooks.Add    'No.177で修正ブックを新規に1つ作る
     
     '.body のデータをループする
     For Each objTAG In objIE.document.body.all
        'テーブルのタグを探す
        If objTAG.tagName = "TABLE" Then
            'TABLEの中、テキスト文字で[終値]があるか、チェックする No.177
            If InStr(objTAG.InnerText, "終値") > 0 Then  '終値見つかったか?
                '新規シートを追加する
                Sheets.Add   'No.177で修正、新規シートを作成する
                'カウンタの初期化
                y = 0 '行カウンタ
                'テーブル内のITEMでループする
                For Each objTableItem In objTAG.all
                    strTAGNAME = objTableItem.tagName  'テーブル、タグ名
                    If strTAGNAME = "TR" Then
                        y = y + 1   '行カウンタを+1
                        x = 1 '列カウンタを1(左端にする)
                    End If
                    '↓No.177でTHもセットするように変更 TD or THの時
                    If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
                        'テキストデータをセットする
                        Cells(y, x) = objTableItem.InnerText
                        x = x + 1 '列カウンタを+1(次にする)
                    End If
                Next
            End If
        End If
     Next

End Sub
よし、OK...と思ったら、ほかにも2つ変なシートができてるよ・・・

/* * 4.TABLEの中、InnerHTMLにTABLEが存在するか? */

原因は大外のワク(TABLE)の中でも、 InStr(objTAG.InnerText, "終値") が存在すると判断してしまったみたいですね。 チョコレートやお菓子の多重包装、 箱の中にさらに個別の包装じゃないんだからさ・・ そこで、 InStr(objTAG.InnerHTML, "TABLE") = 0 とテーブルタグが見つからない、、と条件を+してみます。 ※オイオイ、、なめんなよ、Instrだけだと、 もしTABLEって文字があったらどうすんの?  タグじゃなくてさ・・・ まぁ、今回は手抜きでInStrでTABLEの文字を探しますが、  汎用性のあるシステムでは、TABLEタグを探してくださいね。 TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック If InStr(objTAG.InnerText, "終値") > 0 _ And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか 上記2行を+してみます。
Sub ie_make_table_test()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object  'TAGのオブジェクトを代入
    Dim strURL   As String  'URLの文字列
    Dim strTAGNAME As String  'タグの名前保存用
    Dim y As Integer
    Dim x As Integer
    Dim objTableItem As Object 'TABLE内のITEM検索用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    strURL = "http://table.yahoo.co.jp/"                'ベースURL
    strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10"   '期間
    strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
    objIE.Navigate strURL  'URLへ

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     '新規ブックを追加する
     Workbooks.Add    'No.177で修正ブックを新規に1つ作る
     
     '.body のデータをループする
     For Each objTAG In objIE.document.body.all
        'テーブルのタグを探す
        If objTAG.tagName = "TABLE" Then
            'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
            If InStr(objTAG.InnerText, "終値") > 0 _
              And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか
                '新規シートを追加する
                Sheets.Add   'No.177で修正、新規シートを作成する
                'カウンタの初期化
                y = 0 '行カウンタ
                'テーブル内のITEMでループする
                For Each objTableItem In objTAG.all
                    strTAGNAME = objTableItem.tagName  'テーブル、タグ名
                    If strTAGNAME = "TR" Then
                        y = y + 1   '行カウンタを+1
                        x = 1 '列カウンタを1(左端にする)
                    End If
                    '↓No.177でTHもセットするように変更 TD or THの時
                    If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
                        'テキストデータをセットする
                        Cells(y, x) = objTableItem.InnerText
                        x = x + 1 '列カウンタを+1(次にする)
                    End If
                Next
            End If
        End If
     Next

End Sub
これで、無事に終値を含む表を1つだけ取り出すことができました。

/* * 5.だから、.getElementsByTagName使えよ */

ホント、三流君って、.ALLから1つ1つ.TAGNAMEとかで探すの好きだよね。 できたからいいでしょ、動けばあとはアレンジしてよ。。。 私の記憶が正しければ、過去のメルマガに、 No.164 IE .getElementsByTagNameでタグ指定 .Quitで閉じる http://www.ken3.org/vba/backno/vba164.html こんなのあったよね? うん、あったよ。 .getElementsByTagName("TEXTAREA").Item(0).InnerTEXT とこんな感じで、TEXTAREAのアイテムを取り出してたよ。 だったら、If文でTABLEを探さないで、 .getElementsByTagName("TABLE") で、探してもらえば??? うるさいなぁ、もう!!!書けばいいんだろ、書けば。 (より良い方法を親切に教えられるとなぜかキレる子供プログラマー多いよね) '.body のデータをループする For Each objTAG In objIE.document.body.all 'テーブルのタグを探す If objTAG.tagName = "TABLE" Then こいつを '.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す For Each objTAG In objIE.document.getElementsByTagName("TABLE") の1行に書き換えられるって言いたいのかい? こんな感じで、 .getElementsByTagName("TABLE") で、テーブルオブジェクトのみを取り出して処理する方法がスマートかも。 ※三流君的には.allから探すの好きだけどね。
Sub ie_make_table_test()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object  'TAGのオブジェクトを代入
    Dim strURL   As String  'URLの文字列
    Dim strTAGNAME As String  'タグの名前保存用
    Dim y As Integer
    Dim x As Integer
    Dim objTableItem As Object 'TABLE内のITEM検索用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    strURL = "http://table.yahoo.co.jp/"                'ベースURL
    strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10"   '期間
    strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
    objIE.Navigate strURL  'URLへ

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     '新規ブックを追加する
     Workbooks.Add    'No.177で修正ブックを新規に1つ作る
     
     '.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す
     For Each objTAG In objIE.document.getElementsByTagName("TABLE")
        'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
        If InStr(objTAG.InnerText, "終値") > 0 _
          And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか
            '新規シートを追加する
            Sheets.Add   'No.177で修正、新規シートを作成する
            'カウンタの初期化
            y = 0 '行カウンタ
            'テーブル内のITEMでループする
            For Each objTableItem In objTAG.all
                strTAGNAME = objTableItem.tagName  'テーブル、タグ名
                If strTAGNAME = "TR" Then
                    y = y + 1   '行カウンタを+1
                    x = 1 '列カウンタを1(左端にする)
                End If
                '↓No.177でTHもセットするように変更 TD or THの時
                If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
                    'テキストデータをセットする
                    Cells(y, x) = objTableItem.InnerText
                    x = x + 1 '列カウンタを+1(次にする)
                End If
            Next
        End If
     Next

End Sub

/* * 6.終わりの挨拶 */

今回は、 TABLEがいっぱいのHTMLから、 終値が含まれている表をInStr関数で探し、 Excelへセットしてみました。 ポイントは、 ^^^^^^^^^^^^ .InnerTextからInStrで終値の文字を探すことと、 TABLEが2重化されていないか、TABLEの文字を.InnerHTMLから探して判断しました。 おまけで、 .document.getElementsByTagName("TABLE") で、テーブルオブジェクトのみ取り出すことができました。 そんな話でした。 プログラム作りは ^^^^^^^^^^^^^^^^ う〜ん・・・ まぁ、人それぞれ、十人十色、百社百色だけどね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 今回も逃げるように失礼します。 AB型の変わり者、三流プログラマーのKen3でした。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]