| `(セル)
つまり、「外側のループで行を回し、内側のループでセルを回す」という二重構造(ネスト)のロジックを組み立てれば、変換は数学的に導き出せるのです。
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:…”`)に変換する、といった応用にも挑戦してみてください。
エンジニアへの道は、こうした「小さな仕組みの理解」の積み重ねの先にあります。
また次の技術解説でお会いしましょう!
よりよいエクスペリエンスを提供するため、当ウェブサイトでは Cookie を使用しています。引き続き閲覧する場合、Cookie の使用を承諾したものとみなされます。
タイトルとURLをコピーしました
|