Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2007)
【再質問】WEBから特定のTABLEデータを取り出す
投稿日時: 20/06/07 06:30:24
投稿者: moya

すみません、前回質問させていただきましたが、解決できなかったのに間違て解決済みに
しておりました。
今回は、特定の文字以降のTABLEで抜き出しをしてみたいと思い質問させてください。
--抜きたいソース
 <h3><span class="ico-auto">&nbsp;</span>&nbsp;浜松&nbsp;モトロトmini</h3>
         
        <table class="tb70 w100pr">
          <tr>
            <th class="w100px">レース</th>
            <th class="th2 w110px"><a href="/loto/AResult.do?kaisaiBi=20200605&amp;joCode=04&amp;raceNo=8" title="レース結果へ遷移します。">8R</a></th>
            <th class="th2 w110px"><a href="/loto/AResult.do?kaisaiBi=20200605&amp;joCode=04&amp;raceNo=9" title="レース結果へ遷移します。">9R</a></th>
            <th class="th2 w110px"><a href="/loto/AResult.do?kaisaiBi=20200605&amp;joCode=04&amp;raceNo=10" title="レース結果へ遷移します。">10R</a></th>
            <th class="th2 w110px"><a href="/loto/AResult.do?kaisaiBi=20200605&amp;joCode=04&amp;raceNo=11" title="レース結果へ遷移します。">11R</a></th>
            <th class="th2 w110px"><a href="/loto/AResult.do?kaisaiBi=20200605&amp;joCode=04&amp;raceNo=12" title="レース結果へ遷移します。">12R</a></th>
          </tr>
          <tr>
            <th>結果</th>
            <td>3<br /></td>
            <td>7<br /></td>
            <td>7<br /></td>
            <td>5<br /></td>
            <td>7<br /></td>
          </tr>
          <tr>
          <th>残り口数</th>
            <td>12,104</td>
            <td>6,249</td>
            <td>3,289</td>
            <td>432</td>
            <td>413</td>
          </tr>
          <tr>
            <th rowspan="8">結果</th>
            <td colspan="3" height="35" class="al-left bg-7-lt">前回からのキャリーオーバー額</td>
            <td colspan="2" class="al-right bg-7-lt"><strong>0円</strong></td>
          </tr>
          <tr>
            <td colspan="3" class="al-left">投票申込口数</td>
            <td colspan="2" class="al-right"><strong>45,989口(1口100円)</strong></td>
          </tr>
          <tr>
            <td colspan="3" class="al-left">投票金額</td>
            <td colspan="2" class="al-right"><strong>4,598,900円</strong></td>
          </tr>
          <tr>
            <td colspan="3" class="al-left">返還金額</td>
            <td colspan="2" class="al-right"><strong>0円</strong></td>
          </tr>
          <tr>
            <td colspan="3" class="al-left">有効投票金額</td>
            <td colspan="2" class="al-right"><strong>4,598,900円</strong></td>
          </tr>
          <tr>
            <td colspan="2" class="al-left">一口当りの払戻金(総当選口数)</td>
            <td colspan="1">3,7,7,5,7<br /></td>
            <td colspan="2" class="al-right"><strong>7,790円(413口)<br /></strong></td>
          </tr>
          <tr>
            <td colspan="3" class="al-left">次回へのキャリーオーバー額</td>
            <td colspan="2" class="al-right"><strong>0円</strong></td>
          </tr>
        </table>
         
      </div>
      <p class="al-right">
        <a href="#top">ページ先頭へ↑</a>
      </p>
 --------------------------------------------------------------------------
ここの、モトロトminiをキーワードにして、キーワード以降のTABLE内の文字です。
 
省略

[code]'テーブルを探す
    Dim objTABLE As Object 'TABLEの格納用
    
    'TABLEタグを抜き先頭0番目のテーブルをセット
    Set IETABLE = ie.Document.getElementsByTagName("TABLE")(0)
    '↑で代入したオブジェクトからテーブルデータを取り出す。
    
    '書き込み先シートに切り替え、データをクリアする
    Sheets("result取得").Select    'シートを切り替える
    Cells.Delete Shift:=xlUp 'シート全体を削除する
    Range("A2").Select       '先頭A1を選択する
    
    '表をDATAシートに書き出す
    Dim x As Integer  '列の管理
    Dim y As Integer  '行の管理
    
    'Webの表をシートへ転記(代入する)
    For y = 0 To IETABLE.Rows.Length - 1  '行のループ
        For x = 0 To IETABLE.Rows(y).Cells.Length - 1  '列数分ループ
            ' objTABLE.rows(行).cells(列).innertext
            Cells(y + 1, x + 1) = IETABLE.Rows(y).Cells(x)[/code]

------------------------------------------------------------------------------
 
ie.Document.getElementsByTagName("TABLE")(8)の部分をClassとするでしょうか
大変申し訳ありませんが、コードを書いて教えて頂けるとありがたいです。
 

回答
投稿日時: 20/06/07 12:46:43
投稿者: simple

こんにちは。
前回の質問はこちらですね。
https://www.moug.net/faq/viewtopic.php?t=79469
 
前回、Webクエリーが推奨されていたかと思います。
私もそれを使われたらよいと思います。
 
マクロ記録してみましたら、スクリプトエラーが何度か発生しましたが、
かまわず続けると、きちんとマクロ記録がとれました。
 
留意点。
1)Webクエリの"オプション"に"書式設定"があります。
  "HTML形式"を選択すると、結合セルがきちんと反映されると思います。
2)シートにいったん全体をとりこみ、文字列検索(findメソッド)を行います。
  ヒットしたセルに対してCurrentRegionをとると、そのブロックのテーブルが対象になりますから、
 それを別途のセル範囲にコピーペイストすればよいと思います。
3)その表に罫線をつけるとセル間の境界が明確になるようです。
 
いずれもマクロ記録で原型ができますので、必要な修正を追加すればよいと思います。

回答
投稿日時: 20/06/07 14:47:55
投稿者: 半平太

>ie.Document.getElementsByTagName("TABLE")(8)の部分をClassとするでしょうか
 
 テーブルの順番が確定しているなら、8とか7とかで、決め打ちできると思いますが、
「モトロトminiをキーワード」にする方針とマッチしているかどうか・・微妙ですね。
 
 [h3]の全タグを調べて、
「モトロトmini」を含んでいるタグを見つけ、
 その親タグに含まれる全タグをしらみつぶしにチェックして、
「モトロトmini」が現れたら、次に出てくるTABLEタグがターゲットである、
と判断するのはどうですかね。
 

> :  :  
>  Dim objTABLE As Object 'TABLEの格納用
> :  :  :
>  Sheets("result取得").Select    'シートを切り替える
> :  :  
 ↓
  :  :  
    Dim objTABLE As Object 'TABLEの格納用
    Dim H3tags As Object
    Dim ParentElm As Object
    Dim aTag As Object
    
    Set H3tags = ie.Document.getElementsByTagName("h3")
    
    For Each aTag In H3tags
        If InStr(aTag.innerText, "モトロトmini") Then
            Set ParentElm = aTag.parentElement
            Exit For
        End If
    Next
    
    Dim found As Boolean
    
    If ParentElm Is Nothing Then
        Exit Sub
    Else
        found = False
        For Each aTag In ParentElm.all

            If InStr(aTag.innerText, "モトロトmini") Then
                found = True
            End If
            
            If aTag.tagName = "TABLE" And found = True Then
                Set ieTABLE = aTag
                Exit For
            End If
        Next
    End If
    
    '書き込み先シートに切り替え、データをクリアする
    Sheets("result取得").Select    'シートを切り替える
  :  :  

投稿日時: 20/06/07 15:10:38
投稿者: moya

simpleさん、アドバイスありがとうございます、スクリプトエラーで取り込みできなかと思ってました。
 
半平太さん
想定通り動作致しました、ありがとうございました。
大変助かりました。