【入門編】【中級者向け】Word表をHTMLテーブルタグに変換し、Webサイト用データとしてクリップボードへ送る – Word VBA解析バイブル

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

Word VBAからWebの世界へ:表データをHTML化してクリップボードへ送る「架け橋」の技術

こんにちは。技術の荒波を共に乗り越えていく同志の皆さん。
今日は、少しだけ「マクロの記録」という安全な岸辺を離れて、もっと広大な「データの連携」という大海原へ漕ぎ出してみませんか?

「マクロの記録」でボタンを押して、できたコードを眺める。それは素晴らしい第一歩です。しかし、あなたがもし「Wordで作った表を、そのままブログやWebサイトのHTMLとして使いたい」「Wordのデータを別のシステムに流し込みたい」と願うなら、そこには「オブジェクトの構造を理解し、データを再構築する」というエンジニアリングの真髄が必要になります。

今回のテーマは、Wordの表(Table)を解析し、HTMLの`

`タグへと変換して、クリップボードに格納するというものです。

このコードが書けるようになると、Wordは単なる文書作成ソフトではなく、強力な「データ変換エンジン」へと進化します。さあ、一緒にマスターしていきましょう。

1. 本質的な設計思想:Wordオブジェクトをどう解釈するか

プログラミングにおいて、最も重要なのは「コードを書く前」に、データの構造を頭の中に描くことです。

Wordの表は、階層構造(オブジェクトモデル)を持っています。
1. Document(文書)
2.  ┗ Tables(表の集合)
3.   ┗ Table(個々の表)
4.    ┗ Rows(行の集合)
5.     ┗ Cells(セルの集合)

HTMLのテーブル構造も、これと全く同じです。

  • `
`
  • ┗ `
  • `(行)
  • ┗ `
  • `(セル)

    つまり、「外側のループで行を回し、内側のループでセルを回す」という二重構造(ネスト)のロジックを組み立てれば、変換は数学的に導き出せるのです。

    2. 実装:HTML変換エンジンのコード

    それでは、実際に動くコードを見てみましょう。
    初心者の方が躓きやすい「クリップボード操作」については、設定不要で動くよう「レイトバインディング(遅延結合)」というプロのテクニックを用いて記述しています。

    Option Explicit
    
    ''' <summary>
    ''' Wordの表をHTML形式に変換し、クリップボードへコピーする
    ''' </summary>
    Sub ConvertTableToHTMLAndCopy()
        Dim targetTable As Table
        Dim targetRow As Row
        Dim targetCell As Cell
        Dim htmlBuffer As String
        Dim cellText As String
        Dim dataObj As Object ' MSForms.DataObject用
        
        ' 1. 対象となる表の存在チェック
        ' 文書内に表がない場合は終了する
        If ActiveDocument.Tables.Count = 0 Then
            MsgBox "文書内に表が見つかりません。", vbExclamation
            Exit Sub
        End If
        
        ' ここでは文書内の「最初の表」を対象にします
        Set targetTable = ActiveDocument.Tables(1)
        
        ' 2. HTMLの組み立て開始
        ' 効率化のため、文字列を連結していくバッファを用意します
        htmlBuffer = "<table border=""1"">" & vbCrLf
        
        ' 3. 行のループ処理 (Outer Loop)
        For Each targetRow In targetTable.Rows
            htmlBuffer = htmlBuffer & "  <tr>" & vbCrLf
            
            ' 4. セルのループ処理 (Inner Loop)
            For Each targetCell In targetRow.Cells
                ' 【重要】Wordのセルには末尾に特殊な制御文字(Chr(13) & Chr(7))が含まれています。
                ' これを除去しないと、HTMLが壊れてしまいます。
                cellText = targetCell.Range.Text
                cellText = Left(cellText, Len(cellText) - 2) ' 末尾の2文字をカット
                
                ' HTMLタグとしてセルを書き出し
                htmlBuffer = htmlBuffer & "    <td>" & cellText & "</td>" & vbCrLf
            Next targetCell
            
            htmlBuffer = htmlBuffer & "  </tr>" & vbCrLf
        Next targetRow
        
        ' 5. HTMLの閉じタグ
        htmlBuffer = htmlBuffer & "</table>"
        
        ' 6. クリップボードへの格納
        ' MSForms.DataObjectをレイトバインディングで呼び出し
        ' これにより、参照設定の手間を省き、配布時のエラーを防ぎます
        On Error Resume Next
        Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        
        If Err.Number <> 0 Then
            MsgBox "クリップボードへのアクセスに失敗しました。" & vbCrLf & _
                   "Windowsの環境設定を確認してください。", vbCritical
            Exit Sub
        End If
        On Error GoTo 0
        
        dataObj.SetText htmlBuffer
        dataObj.PutInClipboard
        
        MsgBox "HTML変換が完了しました!クリップボードにコピーされています。", vbInformation
    End Sub

    3. ここがプロの分かれ目:陥りやすい3つの罠

    コードをただ写すだけでは、本当のエンジニアにはなれません。このコードに隠された「設計の意図」を理解しましょう。

    ① 「末尾の2文字」の正体(制御文字問題)

    Wordのセルには、見た目には見えない「セルの終わりを示す特殊な文字(`Chr(13)` と `Chr(7)`)」が必ずセットで入っています。
    これをそのままHTMLに流し込むと、Webブラウザで表示したときに変な改行や空白、あるいはタグの崩れを引き起こします。
    `Left(cellText, Len(cellText) – 2)` という処理は、この「Word特有のゴミ」を取り除くための、極めて重要なクリーニング作業なのです。

    ② クリップボードの「参照設定」問題

    通常、VBAでクリップボードを扱うには「Microsoft Forms 2.0 Object Library」への参照設定が必要です。しかし、これを行うと、他の人にツールを渡したときに「参照不可エラー」で動かなくなるリスクが生じます。
    そこで私は、`CreateObject(“New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}”)` という、CLSID(クラスID)を直接指定するテクニックを使いました。これにより、設定不要でどこでも動く「堅牢なコード」を実現しています。

    ③ パフォーマンスの重み

    今回のコードは、小さな表であれば一瞬で終わります。しかし、もし数千行あるような巨大な表を扱う場合、`htmlBuffer = htmlBuffer & …` という書き方は少しずつ重くなります(文字列の再割り当てが発生するため)。
    もしあなたが「超大規模データ」を扱うプロを目指すなら、将来的に`Array`(配列)に格納してから一度に結合する手法を学んでみてください。それが次のステップです。

    4. まとめ:次のステップへ

    お疲れ様でした。これであなたは、Wordという「静的な文書」を、HTMLという「動的なWebデータ」へと変換する強力な武器を手に入れました。

    「マクロの記録」は、いわば「決まった動きの再生」です。
    対して、今回学んだような「ループによる解析」と「オブジェクトの操作」は、「状況に応じて自ら考え、データを組み立てる」という、真のプログラミングです。

    ここをクリアすれば、Word VBAの基本はバッチリですよ。
    次は、セルの色(`Cell.Shading`)をHTMLのスタイル(`style=”background-color:…”`)に変換する、といった応用にも挑戦してみてください。

    エンジニアへの道は、こうした「小さな仕組みの理解」の積み重ねの先にあります。
    また次の技術解説でお会いしましょう!

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