ExcelからWordの表を調べる【VBA】
Yahoo!知恵袋で回答した中から、ExcelのVBAでWordのドキュメント内にある表にアクセスし、調べる方法をご紹介します。
質問
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13281340818
Excelのmacroでwordの表をコピーする方法を教えて下さい。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13281340818
For i = 1 To objDoc.Tables([3]).Rows.Count Step 1
で表3の行数を調べてコピーしますが、wordの行数が列によって異なっている場合、macroが止まってしまいます。
「表3の3列目の行数」を調べる方法を教えて下さい。
この方は、質問の冒頭で”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のItemが14個ありますが、それぞれの位置はこんな↓感じでした。
どうも左上から始まって、右に1、2、3と数えているようです。一番右端に到達したら、次の行に移って、4、5、6と数えます。セル結合してあるCellについては到達した時点で1回だけ数え、次に到達しても数えません。
Cellのプロパティはこんな↑感じです。
ColumnとRowのところに<>のついたメッセージが書いてあります。
これは、結合しているセルがあるためアクセスできないということを示しています。
その代わり、ColumnIndexとRowIndexというのが使えますので、今回はこれらを使いました。
まとめ
以上、Wordの表を調べる方法について紹介しました。
セル結合してあるときは、RowsとColumnsは使わず、Range.CellsのRowIndexとColumnIndexを使えばよいです。
-
前の記事
有給休暇管理簿 2023.06.20
-
次の記事
労働時間管理は日々行う 2023.06.22