ExcelからWordの表を調べる【VBA】

Yahoo!知恵袋で回答した中から、ExcelのVBAでWordのドキュメント内にある表にアクセスし、調べる方法をご紹介します。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13281340818

Excelのmacroでwordの表をコピーする方法を教えて下さい。
For i = 1 To objDoc.Tables([3]).Rows.Count Step 1
で表3の行数を調べてコピーしますが、wordの行数が列によって異なっている場合、macroが止まってしまいます。
「表3の3列目の行数」を調べる方法を教えて下さい。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13281340818

この方は、質問の冒頭で”Wordの表をコピーする方法を教えて下さい”と書いていながら、質問の最後に”「表3の3列目の行数」を調べる方法を教えて下さい”と書いてあり、いったいどっちを知りたいのかよく分かりません。内容的に、最後の質問にだけお答えすればよいのかな?と考え、「表3の3列目の行数」を調べる方法を調べました。

回答

私の考えたコードはこちらです。

Option Explicit

Public Sub 表3の3列目の行数を調べる()

    Dim Wd As Word.Application
    Dim Doc As Word.Document
    
    Const cstName As String = "C:\temp\20230621chie_Wordの表.docx"
    
    'Wordを準備する
    Set Wd = New Word.Application
    
    'Wordを可視状態にする
    Wd.Visible = True
    
    'Wordを開く
    Set Doc = Wd.Documents.Open(Filename:=cstName, ReadOnly:=False)
    
    'Wordの表を調べる
    
    '表3を調べるので、そもそもまず表が三つあるかチェック
    
    Dim lTablesCnt As Long
    lTablesCnt = Doc.Tables.Count
    
    If lTablesCnt < 3 Then
        Exit Sub
    End If
    
    '表3は表内に結合された列や行があるので
    '列単位でのアクセス、行単位でのアクセスができない。
    'そこでRange.Cellsでアクセスする。
    
    Dim lCellsCnt As Long
    lCellsCnt = Doc.Tables(3).Range.Cells.Count
    
    Dim ii As Long
    Dim lRowsCnt As Long
    lRowsCnt = 0
    For ii = 1 To lCellsCnt
        '「表3の3列目の行数」を調べる
        If Doc.Tables(3).Range.Cells(ii).ColumnIndex = 3 Then
            lRowsCnt = lRowsCnt + 1
        End If
    Next ii
    
    Debug.Print "表3の3列目の行数は" & lRowsCnt & "です"
    
    'Wordを閉じる
    Doc.Close
    Wd.Quit
    Set Doc = Nothing
    Set Doc = Nothing
    
End Sub

Excelの標準モジュールに記述しました。

Microsoft Word XX.X Object Libraryの参照設定をしてあります。

解説

今回テスト用に用意した表はこんな感じです。

テスト用に用意した表

3番目の表は、あちこち結合してあります。

こういう表に、通常のやり方(TablesのRowsやColumnsを使うやり方)ですと次のようなエラーが出てしまいます。

そこで、RowsもColumnsも使わず、Tablesが持っているRangeプロパティのCellsプロパティを使ってアクセスしていきます。

デバッグ中にローカルウィンドウで見たCellsの中身。

CellsのItemが14個ありますが、それぞれの位置はこんな↓感じでした。

Cellsの内訳(一部省略)

どうも左上から始まって、右に1、2、3と数えているようです。一番右端に到達したら、次の行に移って、4、5、6と数えます。セル結合してあるCellについては到達した時点で1回だけ数え、次に到達しても数えません。

Cellのプロパティ

Cellのプロパティはこんな↑感じです。

ColumnとRowのところに<>のついたメッセージが書いてあります。

これは、結合しているセルがあるためアクセスできないということを示しています。

その代わり、ColumnIndexとRowIndexというのが使えますので、今回はこれらを使いました。

まとめ

以上、Wordの表を調べる方法について紹介しました。

セル結合してあるときは、RowsとColumnsは使わず、Range.CellsのRowIndexとColumnIndexを使えばよいです。