Excelで管理しているデータを、簡易的なWebページやHTML形式のレポートとして出力したい、という場合があります。VBAを使えば、HTMLタグを文字列として組み立て、.html
ファイルとして保存することが可能です。
この記事では、ADODB.Stream
オブジェクトを利用して、文字化けを防ぐための標準的な文字コードである「UTF-8」で、HTMLファイルを作成する基本的な方法を解説します。
完成したVBAコード
まずは、基本的なHTMLファイルを作成するVBAコードです。<html>
や<head>
、<body>
といった、HTML文書の骨格となるタグを含んでいます。
Sub CreateSimpleHtmlFile()
' 変数を宣言します
Dim streamObj As Object
Dim htmlFilePath As String
' 作成するHTMLファイルのパスを指定
htmlFilePath = ThisWorkbook.Path & "\MyReport.html"
' ADODB.Streamオブジェクトを生成
Set streamObj = CreateObject("ADODB.Stream")
' --- 1. Streamオブジェクトの設定 ---
With streamObj
.Type = 2 ' 2はadTypeText (テキストモード)
.Charset = "UTF-8" ' 文字コードをUTF-8に設定
.Open ' ストリームを開く
' --- 2. HTMLコンテンツの書き込み ---
.WriteText "<html>" & vbCrLf
.WriteText "<head>" & vbCrLf
.WriteText " <meta charset=""UTF-8"">" & vbCrLf
.WriteText " <title>VBAから作成したレポート</title>" & vbCrLf
.WriteText "</head>" & vbCrLf
.WriteText "<body>" & vbCrLf
.WriteText " <h1>これはVBAで作成した見出しです</h1>" & vbCrLf
.WriteText " <p>最初の段落です。</p>" & vbCrLf
.WriteText "</body>" & vbCrLf
.WriteText "</html>" & vbCrLf
' --- 3. ファイルへの保存と後処理 ---
.SaveToFile htmlFilePath, 2 ' 2はadSaveCreateOverWrite (上書き保存)
.Close ' ストリームを閉じる
End With
' オブジェクトを解放
Set streamObj = Nothing
MsgBox "HTMLファイルの作成が完了しました。"
End Sub
コードのポイント解説
① ADODB.Streamオブジェクトの利用
HTMLファイルはテキストファイルの一種ですが、Webで正しく表示させるためには文字コードを**「UTF-8」**で保存するのが一般的です。ADODB.Stream
オブジェクトを使えば、.Charset = "UTF-8"
と指定するだけで、簡単にUTF-8形式のファイルを作成できます。これが、この方法を使う最大のメリットです。
② HTMLコードの組み立てと書き込み (.WriteText)
.WriteText "<h1>これはVBAで作成した見出しです</h1>" & vbCrLf
HTMLファイルの作成は、VBAで<h1>
や<p>
といったHTMLタグを文字列として組み立て、.WriteText
メソッドで一行ずつ書き込んでいくだけのシンプルな作業です。vbCrLf
を末尾につけることで、出力されるHTMLファイルのソースコードに改行が入り、人間が見ても読みやすくなります。
③ ファイルへの保存と後処理 (.SaveToFile)
.SaveToFile
メソッドで、メモリ上のストリームの内容を物理的なファイルに書き出します。第二引数に2
(adSaveCreateOverWrite
) を指定すると、同名ファイルが存在した場合に自動で上書き保存してくれます。最後に必ず.Close
でストリームを閉じ、後片付けをします。
応用:ExcelのデータをHTMLの表にする
このテクニックを応用すれば、Excelのセル範囲のデータをHTMLのテーブル(<table>
タグ)として出力することも可能です。
Sub ExportRangeToHtmlTable()
Dim streamObj As Object, sourceRange As Range, rw As Range, cl As Range
Dim htmlFilePath As String
htmlFilePath = ThisWorkbook.Path & "\DataTable.html"
Set sourceRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:C5") '表にしたい範囲
Set streamObj = CreateObject("ADODB.Stream")
With streamObj
.Type = 2
.Charset = "UTF-8"
.Open
' --- HTMLの基本構造 ---
.WriteText "<html><head><meta charset=""UTF-8""><title>データ表</title></head><body>" & vbCrLf
.WriteText "<h2>Excelからのデータ</h2>" & vbCrLf
.WriteText "<table border=""1"" style=""border-collapse: collapse;"">" & vbCrLf
' --- Excelの範囲をループしてテーブル行を作成 ---
For Each rw In sourceRange.Rows
.WriteText " <tr>" & vbCrLf ' 行の開始タグ
For Each cl In rw.Cells
.WriteText " <td>" & cl.Value & "</td>" & vbCrLf ' セルのタグと値
Next cl
.WriteText " </tr>" & vbCrLf ' 行の終了タグ
Next rw
' --- HTMLの終了タグ ---
.WriteText "</table>" & vbCrLf
.WriteText "</body></html>" & vbCrLf
.SaveToFile htmlFilePath, 2
.Close
End With
Set streamObj = Nothing
MsgBox "HTMLテーブルの作成が完了しました。"
End Sub
このコードは、ExcelのA1:C5
範囲をループ処理し、一行ずつ<tr>
(テーブルの行)タグを、一セルずつ<td>
(テーブルのセル)タグを生成することで、HTMLの表を動的に組み立てています。
まとめ
VBAによるHTMLファイルの作成は、**「HTMLタグを文字列として組み立て、テキストファイルとして書き出す」**という考え方が基本です。
その際、Web標準であるUTF-8で保存するためにADODB.Stream
オブジェクトを利用するのが、最も確実で推奨される方法です。Excelのデータをループ処理と組み合わせることで、静的なページだけでなく、データに基づいた動的なHTMLレポートの生成も可能になります。