【脱・マクロ記録】Wordの巨大な表を「1行1ファイル」に自動分割する極意
こんにちは。現場の最前線でコードを書き続けるアーキテクトです。
Wordで「表のデータを別々のファイルに保存したい」という作業、手作業でやっていませんか? 10行ならまだしも、50行、100行と続けば、それはもはや拷問です。
今日は、Word VBAを使って、「巨大な表の各行を抽出し、テンプレートに流し込んで別々のファイルとして書き出す」という自動化の極意を伝授します。マクロの記録から一歩踏み出し、Wordのオブジェクト構造を操る「真の自動化」を体験しましょう。
—
1. なぜ「表の分割」が難しいのか?
多くの人がここで挫折する理由は、Wordの「レンジ(Range)」と「表(Table)オブジェクト」の関係性を理解できていないからです。
Word VBAにおいて、表は単なる箱ではありません。`Table`オブジェクトの中に `Row`(行)があり、さらにその中に `Cell`(セル)があり、その中に `Range`(テキストの範囲)がある……という階層構造をしています。
この構造を理解せずにコードを書くと、`”実行時エラー 4605″`(そのメソッドまたはプロパティは利用できません)の沼にハマります。まずは構造を正確に掴みましょう。
—
2. 自動化の設計図:3ステップ
今回のツールは、以下の3ステップで動かします。
1. 元データの表を特定する: ターゲットとなる表をオブジェクトとして捕まえる。
2. テンプレートを開く: 雛形となるWordファイル(.docx)を複製する。
3. データを流し込んで保存: 各セルのテキストを読み取り、テンプレートの「しおり(ブックマーク)」へ転記する。
—
3. 実践:表分割ツール・プロフェッショナル・コード
それでは、現場で即戦力となるコードをご覧ください。
Sub SplitTableToDocuments()
Dim docSource As Document: Set docSource = ActiveDocument
Dim tbl As Table: Set tbl = docSource.Tables(1) ‘ 最初の表を対象にする
Dim i As Long
Dim templatePath As String: templatePath = “C:\Temp\Template.docx” ‘ テンプレートのパス
‘ 表の2行目から最終行までループ(1行目はヘッダーと仮定)
For i = 2 To tbl.Rows.Count
‘ 1. テンプレートを開く(毎回新規で開くことでメモリ負荷を避ける)
Dim docNew As Document
Set docNew = Documents.Open(templatePath)
‘ 2. 各セルのテキストを取得して転記
‘ ここでは「名前」「部署」「金額」が1,2,3列目にあると想定
Call FillBookmark(docNew, “Name”, tbl.Cell(i, 1).Range.Text)
Call FillBookmark(docNew, “Dept”, tbl.Cell(i, 2).Range.Text)
Call FillBookmark(docNew, “Price”, tbl.Cell(i, 3).Range.Text)
‘ 3. ファイルを保存して閉じる
docNew.SaveAs2 FileName:=docSource.Path & “\Output_” & i & “.docx”
docNew.Close SaveChanges:=wdDoNotSaveChanges
Next i
MsgBox “全行の分割保存が完了しました!”, vbInformation
End Sub
‘ ブックマークに値を流し込む共通メソッド
Sub FillBookmark(doc As Document, bookmarkName As String, textValue As String)
If doc.Bookmarks.Exists(bookmarkName) Then
Dim rng As Range
Set rng = doc.Bookmarks(bookmarkName).Range
‘ 余分な改行コード(Chr(13) + Chr(7))を除去する
textValue = Left(textValue, Len(textValue) – 2)
rng.Text = textValue
‘ ブックマークを再定義して維持する
doc.Bookmarks.Add bookmarkName, rng
End If
End Sub
—
4. 現場で役立つ「3つの極意」
① 「余分な文字」を削ぎ落とせ
Wordの表のセルから取得したテキストには、必ず`Chr(13) & Chr(7)`(段落記号とセル末尾記号)が含まれます。これを取り除かないと、テンプレートに流し込んだ瞬間にレイアウトが崩壊します。上記の `Left(textValue, Len(textValue) – 2)` は、この呪縛を解くための定石です。
② ブックマークを活用せよ
テンプレートに値を流し込む際、`Find.Execute` などを使うと誤動作のリスクがあります。「ブックマーク(しおり)」を埋め込んでおき、そこを `Range` として特定して書き換えるのが、最も堅牢(ロバスト)な手法です。
③ オブジェクトを解放する意識
大量の文書を生成する場合、メモリリークは致命的です。`docNew.Close` を忘れずに行い、Wordのインスタンスを確実に解放することで、安定して数百件のファイルを処理できます。
—
最後に:自動化は「あなたの時間」を作るもの
このコードをコピー&ペーストするだけでは、まだ半分しか達成できていません。
「この表の列が増えたらどうするか?」「保存先のフォルダをダイアログで指定するには?」といった課題を、一つずつ自分の手で改造してみてください。その試行錯誤こそが、あなたを「マクロを使える人」から「自動化エンジニア」へと進化させる最短ルートです。
ここをクリアすれば、Word VBAの基本構造は完全にあなたの掌の中にあります。次はどんな自動化に挑戦しますか? 応援していますよ。
