ExcelからHTMLのテーブルを生成するマクロ(VBA)
2025年 4月15日 Posted 野々瀨(フロントエンドエンジニア)
Excelの表をマクロ(VBA)を使って、HTMLのテーブルとしてコピーする方法をご紹介しようと思います。OSはWindows 11、ExcelのバージョンはMicrosoft Excel 2016を基準にご紹介します。
注意事項
- けい線や配色などの装飾はHTMLには反映されません。
- 結合されているセルには対応していません。
- 関数の使用や書式を指定している場合、表示されている見た目の値が反映されます。
シートの準備
テーブルにするデータを準備します。

開発タブを開き、[挿入]から[ボタン]を押します。

任意の場所へドラッグなどで設置します。

「マクロの登録」ダイアログが表示されますが、[キャンセル]ボタンを押します。

設置されたボタンを右クリックし、表示されたコンテキストメニューから[テキストの編集]を押します。

ボタンのテキストが編集可能様態になりますので、適当な名称に変更します。ここでは「HTMLとして出力」へ変更しています。

開発タブがないとき
開発タブがない場合は、まず[ファイル]タブを押します。

左メニューの最下部の方にある[オプション]を押します。

左メニューにある[リボンのユーザー設定]を押し、右側のリストボックスの中にある[開発]のチェックボックスにチェックを入れ、[OK]ボタンを押します。

これで開発タブが表示されます。
マクロ
設置したボタンを右クリックし、表示されたコンテキストメニューから[マクロの登録]を押します。

「マクロの登録」ダイアログが表示されたら、マクロ名を適当に変更し、[新規作成]ボタンを押します。

エディターが表示されます。Sub マクロ名()とEnd Subとの間にコードを書くことになります。

なお、このSubはプロシージャといい、処理がまとめられて記述されたものです。繰り返して呼び出すことも可能で、サブルーチンとも呼びます。
セルを取得しHTMLを作成
「HTMLのテーブルで出力」プロシージャに次のコードを記述します。
Sub HTMLのテーブルで出力()
Dim lastRowVal As Long
Dim lastColumnVal As Long
Dim rowRange As Range
Dim colRange As Range
Dim tableStr As String
lastRowVal = Range("A1").SpecialCells(xlLastCell).Row
lastColumnVal = Range("A1").SpecialCells(xlLastCell).Column
tableStr = tableStr & "<table>" & vbLf
For Each rowRange In Range(Cells(1, 1), Cells(lastRowVal, lastColumnVal)).Rows
If rowRange.Row = 1 Then
tableStr = tableStr & vbTab & "<thead>" & vbLf
ElseIf rowRange.Row = 2 Then
tableStr = tableStr & vbTab & "<tbody>" & vbLf
End If
tableStr = tableStr & String(2, vbTab) & "<tr>" & vbLf
For Each colRange In rowRange.Columns
If rowRange.Row = 1 Then
tableStr = tableStr & String(3, vbTab) & "<th>" & colRange.Value & "</th>" & vbLf
Else
tableStr = tableStr & String(3, vbTab) & "<td>" & colRange.Value & "</td>" & vbLf
End If
Next colRange
tableStr = tableStr & String(2, vbTab) & "</tr>" & vbLf
If rowRange.Row = 1 Then
tableStr = tableStr & vbTab & "</thead>" & vbLf
ElseIf rowRange.Row = lastRowVal Then
tableStr = tableStr & vbTab & "</tbody>" & vbLf
End If
Next rowRange
tableStr = tableStr & "</table>"
End Sub
8、9行目では入力されている最後のセルの行と列の番号を取得します。
lastRowVal = Range("A1").SpecialCells(xlLastCell).Row
lastColumnVal = Range("A1").SpecialCells(xlLastCell).Column
SpecialCellsメソッドは引数で指定したxlLastCellのセルを取得します。定数xlLastCellは行列でみた最後のセルを表します。
13行目ではRangeオブジェクトでA1から入力されている最後のセルまでの範囲を取得します。
For Each rowRange In Range(Cells(1, 1), Cells(lastRowVal, 1213lastColumnVal)).Rows
Next rowRange
Rowsプロパティでその範囲の全ての行を取得します。取得した行をFor Each...Nextステートメントで繰り返し処理します。
22行目では繰り返されている行から列を取得し、繰り返しています。
For Each colRange In rowRange.Columns
Next colRange
クリップボードへコピーする処理
まずエディターのメニュー[ツール]を開き、[参照設定]を押します。

[参照]ボタンを押します。

「C:\Windows\SysWOW64」ディレクトリーを開き、その中にある「FM20.DLL」を選択し、[開く]ボタンを押します。

「参照可能なライブラリ ファイル」の中に「Microsoft Forms 2.0 Object Library」が表示されますので、それにチェックを入れて[OK]ボタンを押します。

続いて「HTMLのテーブルで出力」プロシージャのEnd Subの後に、次のプロシージャを記述します。
Sub クリップボードへコピー(ByVal targetStr As String)
Dim cb As New DataObject
cb.SetText targetStr
cb.PutInClipboard
MsgBox "クリップボードへコピーしました。"
End Sub
2行目にあるDataObjectオブジェクトでクリップボードを扱います。
Dim cb As New DataObject
先ほど「Microsoft Forms 2.0 Object Library」を有効にしましたが、DataObjectオブジェクトを扱えるようにするために有効にしました。
4行目のSetTextメソッドで、指定した引数の文字をクリップボードの対象として設定します。
cb.SetText targetStr
5行目のPutInClipboardメソッドで、設定した文字をクリップボードへコピーします。
cb.PutInClipboard
「HTMLのテーブルで出力」プロシージャのEnd Subの前に、「クリップボードへコピー」プロシージャを呼び出すコードを記述します。
Sub HTMLのテーブルで出力()
...
Call クリップボードへコピー(tableStr)
End Sub
これで一連の処理の準備は完了しました。
動作確認
実際の動作を確認します。Excelのシートへ戻り、追加したボタンを押すと「クリップボードへコピーしました。」とメッセージダイアログが表示されます。

メモ帳や他のテキストエディターなどで貼り付けて見ると、クリップボードへコピーされたことが確認できます。

