『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Excelの表をHTMLテーブルに変換します

今回はサイトやブログを運営している皆さんに、スペシャルな VBA マクロを提供しちゃいますよ。な、な、なんと、Excelのテーブル形式データをそのまま HTMLのテーブルに変えてしまうマクロなのです!(← 大げさ)
 
いくつかのバージョンを試作してみましたけれど、その中でも配列による高速処理を徹底したプログラムを紹介します。これで何万行もあるデータも安心して HTMLテーブルに変換できます。テーブル形式データであれば何でも構いませんけど、すぐに用意できない人は下の表をコピーして試してみてください(念のために言っておきますが下記住所は実在しません)。

氏名 ふりがな 住所
本出 光見 ほんで こうけん 茨城県ひたちなか市木葉下10-42-5
波羅蜜 共成 はらみつ ともなり 栃木県那須烏山市烏帽子「榛名湖畔」5-32-26
殖木 梓 ふえき あずさ 群馬県北群馬郡圷大野33
黒葛原 綾 つづらはら あや 埼玉県さいたま市緑区姫子5-13-48
中虫壁 優理子 なかむしかべ ゆりこ 千葉県木更津市石名坂5-12-25

これをシートに貼りつけて、必ず「見出し付」のテーブル形式に変換してください。データをテーブルに変換する方法は 「表をテーブルに変換しましょう」 の記事を参考にしてください。

【VBA】HTMLテーブルに変換するマクロ

エクセルのテーブルを見出し付 HTML テーブルに変換するマクロです。ワークシートのテーブル内のセルを選択して以下のHTML_Tableマクロを実行すると、今開いているブックと同じフォルダにデータの入ったテキストファイルが作成されます。

Option Base 1

'[VBA] Excelの表をHTMLテーブルに変換するマクロ

Sub HTML_Table()

  Dim i As Long, j As Long
  Dim ctr As Long, ctc As Long
  Dim mydata As Variant
  Dim mystr() As String
  Dim myfno As Integer
  Dim mytxt As String

  '選択されたリストを2次元配列変数に入れます
  mydata = Selection.ListObject.Range

  '行数と列数を取得します
  ctr = UBound(mydata, 1)
  ctc = UBound(mydata, 2)

  '2行目以降のデータを<td>と</td>で囲みます
  For j = 1 To ctc
    For i = 2 To ctr
      mydata(i, j) = "<td>" & mydata(i, j) & "</td>"
    Next i
  Next j

  '見出し部分だけ<th>と</th>で囲みます
  For j = 1 To ctc
    mydata(1, j) = "<th>" & mydata(1, j) & "</th>"
  Next j

  '1列目に<tr>、最終列に</tr>を付けます
  For i = 1 To ctr
    mydata(i, 1) = "<tr>" & mydata(i, 1)
    mydata(i, ctc) = mydata(i, ctc) & "</tr>"
  Next i

  '表全体をtableタグで囲みます
  mydata(1, 1) = "<table>" & mydata(1, 1)
  mydata(ctr, ctc) = mydata(ctr, ctc) & "</table>"

  '配列変数mystrの要素数を決定します
  ReDim mystr(ctr)

  '2次元配列を1次元配列にまとめます
  For j = 1 To ctc
    For i = 1 To ctr
      mystr(i) = mystr(i) & mydata(i, j)
    Next i
  Next j

  'データを保存するファイルの名前を決めます
  mytxt = ActiveWorkbook.Path & "\HTMLTable.txt"

  myfno = FreeFile

  'テキストファイルを開きます
  Open mytxt For Output As #myfno

  'テキストファイルにデータを出力します
  For j = 1 To ctr
    Print #myfno, mystr(j)
  Next j

  'テキストファイルを閉じます
  Close #myfno

End Sub

HTML_Table() を実行するとフォルダに “HTMLTable” というファイルが作成されるので開いてみてね。HTML のタグで囲まれたデータがあるはずです。細かいデザインについては CSS で設定している人が大半だと思うので必要最小限のシンプルな形にしてあります。クラス指定などは自分で付け加えてくださいね。別にデザインなんてどうでもいいと思うなら、そのまま貼るだけでシンプルなテーブルが表示されます。

さすがにちょっと長いマクロなので、全てを説明することはできませんけど、特に難しいことをしているわけでもなく単純な配列操作の繰返しです。ListObject オブジェクトの扱い方に関しては ≫ データベース研究所 あたりの記事を参考にしてください。もし動作に不具合などがあれば御指摘ください。適宜プログラムを修正します。「もうちょっとこうしてほしい」というご要望があれば、それもコメントでお知らせください。もし可能であればまた別記事でリニューアルバージョンを載せます。

ChatGPTにお願いすると、戻り値をクリップボードにコピーする形のコードを書いてくれました。これもなかなか便利そうなので、載せておきます。

Sub ExcelToHTMLTable()
    ' 選択範囲のデータを取得
    Dim rng As Range
    Set rng = Selection
    
    ' HTMLテーブルの開始タグ
    Dim htmlTable As String
    htmlTable = "<table border='1'>"
    
    ' ヘッダーロウの処理
    htmlTable = htmlTable & "<tr>"
    For Each cell In rng.Rows(1).Cells
        htmlTable = htmlTable & "<th>" & cell.Value & "</th>"
    Next cell
    htmlTable = htmlTable & "</tr>"
    
    ' データロウの処理
    For i = 2 To rng.Rows.Count
        htmlTable = htmlTable & "<tr>"
        For Each cell In rng.Rows(i).Cells
            htmlTable = htmlTable & "<td>" & cell.Value & "</td>"
        Next cell
        htmlTable = htmlTable & "</tr>"
    Next i
    
    ' HTMLテーブルの終了タグ
    htmlTable = htmlTable & "</table>"
    
    ' HTMLをクリップボードにコピー
    Set HTMLClip = CreateObject("htmlfile")
    HTMLClip.ParentWindow.ClipboardData.setData "text", htmlTable
    
    ' ユーザに通知
    MsgBox "HTMLテーブルがクリップボードにコピーされました。", vbInformation
End Sub

コメント