【Word VBA】表のセル毎にXMLデータを取得するWordマクロ

2018年7月8日

最近、Wordファイルの検証をお客様から依頼されまして、様々な観点から検証をしていました。

特定の操作をするとWordが落ちてしまうという現象がありその原因を探しました。

現時点では原因はわからずじまいなのですが、そのときに作成したWordマクロが便利なので紹介します。

このマクロでできること

カーソルがある表のセル毎にXMLデータをVBEのイミディエイトウィンドウに表示します。

以下のように縦方向の結合や横方向の結合がされている表でもエラーが発生しません。

以下のように出力されます。

マクロの解説

XMLデータを文書全体で取得する方法を以前の記事(【コード】WordのXMLデータを操作するWordマクロ )で紹介しました。

今回はセル単位で取得しようというものです。

Microsoft MVP(Office Development)のきぬあささんの「すべてのテーブルの結合を解除するWordマクロ」を参考にしてコードを書きました。

行毎に列数を計算して処理をしています。(30行目)

32行目でイミディエイトウィンドウに書き込んでいます。

出力されるXMLデータの解釈については専門のサイトで調べてみてください。

マクロ


Sub 表のセルのXMLデータを出力する()

 Dim myXML As Object
 Dim i As Long
 Dim iMax As Long
 Dim n As Long
 Dim nMax As Long
 Dim myTable As Table
 
 '-------------------------------------------
 '前処理
 '-------------------------------------------
 If Selection.Information(wdWithInTable) = False Then
  MsgBox "表を選択してください。", vbExclamation, "お知らせ"
  Exit Sub
 Else
  Set myTable = Selection.Tables(1)
 End If
 
 Set myXML = CreateObject("MSXML2.DOMDocument")
  
 '-------------------------------------------
 'セル毎のXMLデータの取得
 '-------------------------------------------
 If myXML.LoadXML(myTable.Range.XML) = True Then
  With myXML.SelectNodes("/w:wordDocument/w:body/wx:sect/w:tbl/w:tr")
   iMax = .Length - 1 '最大行数
   For i = 0 To iMax
    With .Item(i).SelectNodes("w:tc")
     nMax = .Length - 1 '行内の最大列数
     For n = 0 To nMax
      Debug.Print .Item(n).XML
     Next n
    End With
   Next i
  End With
 End If

 '-------------------------------------------
 '後処理
 '-------------------------------------------
 Set myXML = Nothing
 Set myTable = Nothing

End Sub

関連記事

【コード】WordのXMLデータを操作するWordマクロ

【コード】表中の結合されたセルを着色するWordマクロ

【コード】表中の結合されたセルを着色するWordマクロ(その2) ←バグあり

【コード】表中の結合されたセルを着色するWordマクロ(その3)

【コード】表中の結合・分割セルの有無を判定する

すべてのテーブルの結合を解除するWordマクロ(きぬあささん)

-コード
-,