【入門編】【中級者向け】表のデータをクリップボード経由でExcelへ貼り付ける際のデータ整形 – Word VBA解析バイブル

スポンサーリンク
スポンサーリンク

【脱・マクロ記録】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側への書き込み時に、特定のキーワードが含まれていたらセルに色を塗る」といった、条件付きの書式設定を組み込んでみてください。オブジェクトを自在に操れるようになれば、あなたの業務自動化の武器は、より鋭く、より強力なものになっていくはずです。

応援しています。また次の技術解説でお会いしましょう!

タイトルとURLをコピーしました