Wordの表をExcelへ「ただコピペ」するのは卒業!VBAでデータ整形を自動化する極意
こんにちは。現場で泥臭い自動化を積み重ね、WordとExcelの「見えない壁」を壊し続けてきたアーキテクトです。
Wordで作成した複雑な表をExcelに移そうとして、セルが結合されていたり、改行コードが混ざっていたりして「整形だけで数時間……」という経験はありませんか?
今回は、Wordの表をただコピペするのではなく、「VBAで整形してからクリップボードに送り込む」という、中級者へのステップアップに欠かせないテクニックを伝授します。
—
なぜ「ただのコピペ」ではダメなのか?
Wordの表は、そもそも「ドキュメント上の見た目」を整えるためのオブジェクトです。一方、Excelは「データ解析」のための構造体です。
この両者は似て非なるもの。Word上の表をそのままExcelに貼ると、以下のような「地獄」が待っています。
- セルの結合が解除されず、空行や変な列が生まれる
- セル内の改行がExcel上で強制的に別セルに認識される
- 数値が文字列として扱われ、計算に使えない
これらを解決するには、「Word側でデータ構造を平坦化(フラット化)してからクリップボードへ放り込む」のがプロの流儀です。
—
攻略の鍵:Word VBAで表を「テキスト」として再構築する
今回は、「Wordの表をループで回し、セル内の不要な改行を削除し、タブ区切りの文字列を作成してクリップボードに格納する」コードを実装します。
実践コード:Wordからクリップボードへ整形データ転送
以下のコードをWordのVBAエディタ(Alt + F11)に貼り付けてください。
Sub CopyTableToExcelFormatted()
Dim tbl As Table
Dim row As row
Dim cell As cell
Dim txt As String
Dim data As String
‘ 1. 現在カーソルがある表を取得(なければ終了)
If Selection.Tables.Count = 0 Then
MsgBox “表内にカーソルを置いてください。”
Exit Sub
End If
Set tbl = Selection.Tables(1)
‘ 2. 表の各セルを巡回して文字列を整形
For Each row In tbl.Rows
For Each cell In row.Cells
‘ セル内の余計な改行や段落記号を半角スペースに置換
txt = Replace(cell.Range.Text, Chr(13) & Chr(7), “”) ‘ Wordのセル終端記号の除去
txt = Replace(txt, vbCr, ” “) ‘ 改行をスペースに置換
‘ タブ区切りで連結(Excelが列として認識するため)
data = data & txt & vbTab
Next cell
‘ 行末で改行コードを挿入
data = Left(data, Len(data) – 1) & vbCrLf
Next row
‘ 3. クリップボードへの転送(MS Formsライブラリを利用)
‘ ※事前に「Microsoft Forms 2.0 Object Library」を参照設定してください
Dim myData As New MSForms.DataObject
myData.SetText data
myData.PutInClipboard
MsgBox “整形データをクリップボードにコピーしました!Excelに貼り付けてください。”
End Sub
コードの重要ポイント解説
1. セル終端記号 `Chr(13) & Chr(7)`: Wordの表のセルには、目に見えない「セル終端記号」が含まれています。これを削除しないと、Excelに貼った瞬間にゴミデータとなって現れます。ここが一番の落とし穴です。
2. `vbTab` と `vbCrLf`: Excelは「タブ区切り」を列の区切り、「改行」を行の区切りとして認識します。このルールさえ守れば、複雑な結合セルがあっても、フラットなデータとしてExcelに正しく流し込めます。
3. `MSForms.DataObject`: VBAでクリップボードを操作する際の標準的な手法です。もしエラーが出る場合は、VBAエディタの「ツール」→「参照設定」から「Microsoft Forms 2.0 Object Library」にチェックを入れてください。
—
初学者が陥りやすい「3つの罠」
1. 「マクロの記録」に頼りすぎない
マクロの記録で生成されるコードは `Selection` を多用し、画面描画を伴うため非常に低速です。今回のように `For Each` ループを使い、オブジェクトを直接操作する癖をつけましょう。
2. 結合セルを無視してループを回す
もし表の中に結合セルがある場合、`row.Cells` の数が変わります。今回は単純な表を想定していますが、結合セルが複雑な場合は、`cell.ColumnIndex` を意識したロジックが必要になります。
3. 大容量データの扱い
数千行の表を一度にメモリに乗せようとするとVBAがハングアップします。その場合は、`Open` ステートメントで一度テキストファイル(.csv)として書き出し、Excelで開く手法に切り替えるのが「伝説のエンジニア」の流儀です。
—
さあ、一歩先の世界へ
今回紹介した「データを加工してから渡す」という考え方は、WordとExcelの連携だけでなく、あらゆるシステム連携の基本です。
「コピペ」という手作業を、プログラムによる「データ整形」に置き換える。この小さな意識の積み重ねが、あなたの業務を劇的に速く、そして正確なものに変えていくはずです。
何かうまくいかないことがあれば、いつでも聞いてください。Wordの構造は、知れば知るほど面白いですよ。それでは、次なる自動化の世界でお会いしましょう。
