ExcelからHTMLのテーブルを生成するマクロ(VBA)

2025年 4月15日 Posted 野々瀨(フロントエンドエンジニア)

Excelの表をマクロ(VBA)を使って、HTMLのテーブルとしてコピーする方法をご紹介しようと思います。OSはWindows 11、ExcelのバージョンはMicrosoft Excel 2016を基準にご紹介します。

注意事項

シートの準備

テーブルにするデータを準備します。

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

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

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

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

ボタンのテキストが編集可能様態になりますので、適当な名称に変更します。ここでは「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のシートへ戻り、追加したボタンを押すと「クリップボードへコピーしました。」とメッセージダイアログが表示されます。

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