今回はサイトやブログを運営している皆さんに、スペシャルな 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
コメント