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のシートへ戻り、追加したボタンを押すと「クリップボードへコピーしました。」とメッセージダイアログが表示されます。
メモ帳や他のテキストエディターなどで貼り付けて見ると、クリップボードへコピーされたことが確認できます。