ie-excel

エクセル・マクロでie操作

Excel VBAでIEを操作 結合されたテーブルをエクセルのシートにコピー

2016/10/17

Excelで目的のページにたどり着く方法。
そして、そこにあるテーブルをエクセルにコピーする方法を例示してきました。

今回は該当ページのテーブルデータがマージされていた場合のエクセルへの貼り付け方法を例示したいと思います。

そこで今回のお題は
・セルが不規則に結合されているサイトを表示
・該当サイトのテーブルをエクセルにセル結合させて貼り付ける
を実践。

上記お題は、以下の操作をすることにより可能となります。
・エクセルを起動
・(バージョンによっては)マクロを有効にする
・マクロの編集画面で、以下のコードをコピー&ペースト
・マクロを実行

コピペするコード

Dim ObjIE As Object  '変数を定義
Dim Obj As Object    '変数を定義

Dim j As Integer
Dim i As Integer

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub IE_open()
  
  j = 0
  
  Set ObjIE = CreateObject("InternetExplorer.Application")                'IEを開く際のお約束
  ObjIE.Visible = True                                                    'IEを開く際のお約束
  ObjIE.Navigate "http://www.yahoo.co.jp"                                 '開きたいサイトのURLを指定

  Sleep (1000)

  Do While ObjIE.ReadyState <> 4                                          'サイトが開かれるまで待つ(お約束)
    Do While ObjIE.Busy = True                                            'サイトが開かれるまで待つ(お約束)
   
    Loop
  Loop
  
  For Each Obj In ObjIE.document.all                                      '表示されているサイトのすべてのグ一つずつを変数objにセット
                                                                          '各アンカータグ単位に以下の処理を実施
    Select Case Obj.tagName                                               'タグ名を条件検索
      Case "TR"                                                           'TRタグの場合
        j = j + 1                                                         '行カウンターをカウントアップ
        i = 0                                                             '列カウンターを初期化
      Case "TD", "TH"                                                     'タグが「TD」「TH」の場合に以下の処理を実施

        i = i + 1

        If Worksheets("Sheet1").Cells(j, i).MergeCells Then               '値をセットしようとしているセルが既にセル結合されているかを判定
          Do Until Worksheets("Sheet1").Cells(j, i).MergeCells = False    'セル結合されていなセルまで列カウンターをアップ
             i = i + 1
          Loop
        End If

        Range(Worksheets("Sheet1").Cells(j, i), Worksheets("Sheet1").Cells(j + Obj.rowspan - 1, i + Obj.colspan - 1)).Merge
                                                                          'rowspan,colspanで結合された分だけセルを縦横に結合
        Worksheets("Sheet1").Cells(j, i).Value = Obj.innertext            'innertextの値をセルに設定

    End Select
  Next                                                                    '次のタグを処理

End Sub

「Sheet1」にサンプルサイト同様にセルが結合されてコピペされていませんか?

ではソースの解説です。

        If Worksheets("Sheet1").Cells(j, i).MergeCells Then
          Do Until Worksheets("Sheet1").Cells(j, i).MergeCells = False
             i = i + 1
          Loop
        End If         

処理対象のセルが該当されているかどうかは「MergeCells」で調査できます。
該当セルがマージされていれば、次の列を調査して、セルが結合されていない場所まで列カウンターをアップさせます。
これは、セルの結合が事前に行われていれば、テーブルタグの特性からすでに処理対象外だからです。

続いてのコードです。

        Range(Worksheets("Sheet1").Cells(j, i), Worksheets("Sheet1").Cells(j + Obj.rowspan - 1, i + Obj.colspan - 1)).Merge
        Worksheets("Sheet1").Cells(j, i).Value = Obj.innertext

行の結合はrowspanに結合数が設定されています。
結合されていない場合、値は「1」が設定されています。
(そのため、1を減算しています)
列結合はcolspanに結合数が設定されています。
結合されていない場合、上記同様に値は「1」が設定されています。

そのため、「Merge」する範囲は、上記値を用いて特定することなります。

その上で、タグ内部の値はinnertextに収録されていますので、その値を結合したセルに設定します。

今回のポイントの整理です。
・テーブルの行結合の値は「rowspan」に収録
・テーブルの列結合の値は「colspan」に収録
といった2点がポイントです。

-ExcelでIE操作