こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と頭を抱えていませんか?
大丈夫、安心してください。今日ここでお伝えするコツさえ掴めば、Wordの表はあなたにとって「自由自在に操れる構造化データの宝庫」に変わります。
今回は、Wordの表(Table)を解析し、外部システム(ExcelやWebシステム、データベースなど)へ渡すための「XML形式へのエクスポート」をテーマに、実務で即戦力となるテクニックを優しく、かつ深く解説していきます。
ここをクリアすれば、Word VBAの基本はバッチリですよ!さあ、一緒に扉を開けましょう。
—
なぜWordの表をXML化するのか?
実務の現場では、「仕様書や申請書をWordで書いてもらい、そこに書かれたデータを基幹システムに取り込みたい」という要件が非常によく発生します。
しかし、人間が目視で読むためのWord文書は、往々にして構造がバラバラになりがちです。ここでVBAの出番です。VBAを使ってWordの表を上から順にスキャンし、整然としたXML(Extensible Markup Language)に変換してあげれば、システム連携の準備は完璧になります。
Word表構造の「お作法」を知る
Excelと違い、Wordの表は「行(Row)と列(Column)」の概念に加え、セルの結合(Merge)という魔物が潜んでいます。
これを力技で解決しようとすると、マクロが途中でフリーズしたり、思わぬエラーで止まったりします。プロのエンジニアは、表の「端から端までを安全に巡回するイテレーション(繰り返し処理)」の作法をしっかりと守ります。
—
実装コード:Word表をXMLに変換する
以下のコードは、アクティブ文書の最初の表を読み込み、各セルのデータをきれいにタグ付けされたXML文字列としてイミディエイトウインドウに出力するマクロです。
そのままコピペして、VBAエディタ(Alt + F11)に貼り付けて実行してみてください。
Sub ExportTableToXML()
Dim targetTable As Table
Dim r As Long, c As Long
Dim xmlString As String
Dim cellText As String
‘ 1. 文書内に表が存在するかチェック
If ActiveDocument.Tables.Count = 0 Then
MsgBox “文書内に表が見つかりません。”, vbExclamation, “エラー”
Exit Sub
End If
‘ 2. 最初の表をターゲットにする(複数の場合はループ処理に変更可能)
Set targetTable = ActiveDocument.Tables(1)
‘ 3. XMLのルート要素を開始
xmlString = “” & vbCrLf
xmlString = xmlString & “
‘ 4. 行(Row)のループ開始
For r = 1 To targetTable.Rows.Count
xmlString = xmlString & ”
‘ 5. 列(Column)のループ開始
For c = 1 To targetTable.Columns.Count
On Error Resume Next
‘ セルが存在するか安全に取得(結合セル対策の基本)
cellText = targetTable.Cell(r, c).Range.Text
If Err.Number <> 0 Then
cellText = “” ‘ 結合によって存在しないセルの場合は空文字
Err.Clear
Else
‘ Wordのセル末尾にある特殊文字(改行マークとベルマーク)を取り除く
cellText = Left(cellText, Len(cellText) – 2)
‘ 前後の空白をトリム
cellText = Trim(cellText)
End If
On Error GoTo 0
‘ XMLの子要素としてデータを格納
xmlString = xmlString & ”
Next c
xmlString = xmlString & ” ” & vbCrLf
Next r
‘ 6. XMLのルート要素を終了
xmlString = xmlString & “”
‘ 7. 結果をテキストファイルに出力、またはデバッグ表示
Debug.Print xmlString
MsgBox “XMLへのエクスポートが完了しました!イミディエイトウインドウを確認してください。”, vbInformation, “成功”
End Sub
‘ 【補助関数】XMLの構文を壊す特殊文字をエスケープする関数
Function EscapeXML(ByVal text As String) As String
text = Replace(text, “&”, “&”)
text = Replace(text, “<", "<")
text = Replace(text, ">“, “>”)
text = Replace(text, “”””, “"”)
text = Replace(text, “‘”, “'”)
EscapeXML = text
End Function
—
コードのポイント・中級者へのステップアップ解説
ただ動くだけでなく、「なぜこの書き方をしているのか」を知ることがエンジニアとしての実力をグッと引き上げます。
1. セル末尾の「見えないトラップ」を制する
Wordのセルから `.Range.Text` でテキストを取得すると、文字列の最後に必ず `[CR][CELL]`(改行マークとセルの終了を示す特殊文字) が含まれます。
これをそのままシステムに渡すと、意図しない改行や文字化けの原因になります。
コード内の `Left(cellText, Len(cellText) – 2)` という処理で、この余分な2文字を華麗に削ぎ落としているのがポイントです。
2. 結合セルで発生するエラーを `On Error Resume Next` でいなす
Wordの表でやっかいなのが「セルの結合」です。例えば、1行目の2セルが結合されている場合、2列目を指定して取得しようとするとVBAはエラーを吐いて止まってしまいます。
ここではあえてエラー捕捉を一時的に無効化(`On Error Resume Next`)し、結合によって消えたセルは「空文字」として安全にスルーする設計にしています。これが実務で耐えうる堅牢なコードの書き方です。
3. XMLエスケープ処理への配慮
テキストの中に `&` や `<` などの記号が含まれていると、XMLの構造そのものが壊れてしまいます。これを防ぐために `EscapeXML` という小さな関数を挟んでいます。こうした「細部へのこだわり」が、システム連携時のトラブルをゼロにします。 ---
陥りやすいエラーと対策
- エラー:「インデックスが有効範囲にありません」
- 原因: 表の列数が不揃いな場合や、存在しないセルを指定しているときに起きやすいです。
- 対策: `targetTable.Columns.Count` ではなく、行ごとのセル数 `targetTable.Rows(r).Cells.Count` でループを回すように改良すると、より複雑な表にも対応できます。
—
おわりに
いかがでしたでしょうか?
「Wordの表」という一見アナログに見えるデータも、VBAのオブジェクトモデルを正しく理解してアプローチすれば、立派な構造化データのソースに生まれ変わります。
今回学んだ「安全なループ処理」「特殊文字の除去」「エラーハンドリング」の3本柱は、Word VBAを扱う上で一生モノの武器になります。
ぜひご自身の業務に合わせてカスタマイズし、退屈な手作業を自動化する爽快感を味わってみてください。あなたの自動化ライフを、これからも応援しています!
