【脱・マクロ記録】Wordの表をExcelへ美しく転記する——「結合セル」と「改行」という見えない敵を制する技術
こんにちは。業務自動化の世界へようこそ。
「マクロの記録」を使って、なんとか自動化の第一歩を踏み出した。そんなあなたなら、次にぶつかる壁は決まっています。それは、「データがぐちゃぐちゃになる」という問題です。
特に、Wordの表(Table)をExcelへ移そうとしたとき、こんな経験はありませんか?
- 「結合セルがあるせいで、貼り付けようとするとエラーが出る」
- 「セル内の改行のせいで、Excelの行が勝手にズレてしまう」
- 「コピー&ペーストしたはずなのに、列がバラバラになる」
これらは、WordとExcelという「異なる設計思想を持つオブジェクト」を扱う際に必ず遭遇する、いわば登竜門です。
今日は、単にコピー&ペーストするのではなく、プロのエンジニアが裏で行っている「データの正規化(整え)」という考え方を伝授します。ここをマスターすれば、あなたのVBAは「記録されたコード」から「設計されたプログラム」へと進化しますよ。
1. なぜ、単純なコピー&ペーストは失敗するのか?
まず、敵の正体を知ることから始めましょう。失敗の原因は大きく分けて2つあります。
① 構造の不一致:結合セルの罠
Excelは「縦・横のラインが完璧に揃ったグリッド(格子)」で成り立っています。一方、Wordの表はもっと自由です。「ここからここまでは1つのセル」という結合(Merge)が許容されています。
結合されたセルをそのままExcelに放り込もうとすると、Excelは「この行の列数はいくつなんだ?」と混乱し、貼り付けエラーを引き起こしたり、意図しない位置にデータが流し込まれたりします。
② データの不純物:改行コードの罠
Wordのセル内での改行は、多くの場合 `Chr(13)`(キャリッジリターン)として保持されています。
これをそのままExcelへ貼り付けると、Excelはそれを「新しい行への移動」と誤認することがあります。その結果、「1つのセルに入るはずのデータが、上下2つのセルに分かれてしまう」という現象が発生するのです。
2. アーキテクトの戦略: 「直接転記」へのシフト
中級者への道として、私が最も推奨する戦略はこれです。
「クリップボードを経由せず、VBAでExcelオブジェクトを直接操作して、データを一つずつ流し込む」
クリップボード(Copy & Paste)は人間には便利ですが、プログラムにとっては「中身がブラックボックスな不安定なもの」です。
Wordの各セルをループで回し、中身のテキストを「掃除」してから、Excelのセルへ直接書き込む。これが最も堅牢(ロバスト)な設計です。
3. 実践: データをクレンジングして転記する完全コード
それでは、実際に使えるコードを見ていきましょう。このコードは、Wordの表を解析し、改行をスペースに置き換え、結合セルの影響を回避しながらExcelへ書き込みます。
Option Explicit
''' <summary>
''' Wordの表を解析し、整形した上でExcelへ転記するメインルーチン
''' </summary>
Sub ExportTableToExcelProfessional()
Dim doc As Document
Dim targetTable As Table
Dim xlApp As Object ' Excel.Application
Dim xlWB As Object ' Excel.Workbook
Dim xlSheet As Object ' Excel.Worksheet
Dim r As Long, c As Long
Dim cellText As String
Dim targetRow As Long, targetCol As Long
' 1. 環境のセットアップ
Set doc = ActiveDocument
' 表が存在するかチェック
If doc.Tables.Count = 0 Then
MsgBox "文書内に表が見つかりません。", vbExclamation
Exit Sub
End If
' 最初の表を対象とする(必要に応じて条件を変更してください)
Set targetTable = doc.Tables(1)
' 2. Excelの起動(バックグラウンドで起動)
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
If xlApp Is Nothing Then
Set xlApp = CreateObject("Excel.Application")
End If
On Error GoTo 0
xlApp.Visible = True
Set xlWB = xlApp.Workbooks.Add
Set xlSheet = xlWB.Sheets(1)
' 3. 表の走査とデータ整形
' Wordの行・列の数に基づきループ
For r = 1 To targetTable.Rows.Count
For c = 1 To targetTable.Columns.Count
' エラー回避策:結合セルがある場合、Columns.Countは不規則になることがある
' そのため、各セルへのアクセスを慎重に行う
On Error Resume Next
' セル内のテキストを取得
cellText = targetTable.Cell(r, c).Range.Text
' --- ここからが「データ整形(クレンジング)」の肝 ---
' Wordのセル末尾には必ず Chr(13) & Chr(7) という特殊な記号が入るため削除
cellText = Replace(cellText, Chr(13) & Chr(7), "")
' セル内の改行(Chr(13))を、Excelで扱いやすい「スペース」に置換
' これにより、Excelでの行ズレを完全に防ぐ
cellText = Replace(cellText, Chr(13), " ")
' 前後の余計な空白をトリミング
cellText = Trim(cellText)
' ----------------------------------------------
' Excelのセルへ直接書き込み
' targetRow, targetCol を使って、Excel側の座標を管理
xlSheet.Cells(r, c).Value = cellText
If Err.Number <> 0 Then
' 結合セルなどでアクセスできなかった場合はスキップ
Err.Clear
End If
On Error GoTo 0
Next c
Next r
' 4. 後処理
xlSheet.Columns.AutoFit ' 列幅を自動調整して見やすくする
MsgP = "転記が完了しました!"
MsgBox MsgP, vbInformation
' オブジェクトの解放
Set xlSheet = Nothing
Set xlWB = Nothing
Set xlApp = Nothing
Set targetTable = Nothing
End Sub
4. コードの深層解説: ここがプロの仕事
このコードには、初学者が「マクロの記録」では決して辿り着けない、3つの重要なテクニックが隠されています。
A. `Chr(13) & Chr(7)` の排除
Wordのセルには、目に見えない「セルの終わりを示す特殊な記号」が含まれています。これをそのままExcelに渡すと、文字化けや予期せぬ挙動の原因になります。`Replace` 関数を使って、これを取り除く作業は「儀式」のように必須の工程です。
B. 改行コードの「置換」という決断
`Replace(cellText, Chr(13), ” “)`。
ここがこのプログラムの心臓部です。改行を「消す」のではなく「スペースに置き換える」ことで、「データの意味(情報の区切り)」を維持したまま、構造的なエラーを防いでいます。 もし、どうしても改行を残したい場合は、Excelのセル内で `Alt + Enter` に相当する状態にする必要がありますが、まずはこの「スペース置換」でデータの整合性を守るのが鉄則です。
C. `On Error Resume Next` の戦略的利用
結合セルがある表に対して `targetTable.Cell(r, c)` を実行すると、VBAは「その座標にセルが存在しない」と判断してエラーを吐きます。
プロはここでプログラムを止めません。エラーを一時的に無視し、「存在するセルだけを確実に拾い上げる」という、柔軟な制御を行っています。
5. 次のステップへ
お疲れ様でした。これであなたは、「Wordの表をExcelへ移す」という単純な作業を、「データの整合性を保ちながら転送する」という高度なプロセスへと昇華させることができました。
ここをクリアすれば、Word VBAの基本はバッチリですよ。
次に挑戦するなら、「Excel側への書き込み時に、特定のキーワードが含まれていたらセルに色を塗る」といった、条件付きの書式設定を組み込んでみてください。オブジェクトを自在に操れるようになれば、あなたの業務自動化の武器は、より鋭く、より強力なものになっていくはずです。
応援しています。また次の技術解説でお会いしましょう!
