VBAでHTMLを生成する際、あるセルは<h1>
タグで、別のセルは<p>
タグで囲みたい、というように、内容に応じてHTMLタグを動的に変更したい場合があります。
この記事では、指定した文字列を、指定したタグ名で囲むシンプルな自作関数と、それを前回の記事で紹介したHTMLエスケープ関数と組み合わせて安全に利用する方法を解説します。これにより、非常に柔軟なHTML生成が可能になります。
完成したVBAコード(2つの関数と実行デモ)
まず、今回使用する2つのカスタム関数と、それらを実行するデモ用のプロシージャの全コードを掲載します。このコードを標準モジュールに貼り付けるだけで、すぐに試すことができます。
' =================================================================
' 関数1:HTMLの特殊文字をエスケープ処理する (前回の記事より)
' =================================================================
Function EncodeToHtml(ByVal inputText As String) As String
Dim dom As Object
Dim outputText As String
Set dom = CreateObject("MSXML2.DOMDocument.6.0")
dom.LoadXML "<temp_node />"
dom.FirstChild.Text = inputText
outputText = dom.FirstChild.FirstChild.xml
EncodeToHtml = Replace(outputText, vbCrLf, "<br />")
Set dom = Nothing
End Function
' =================================================================
' 関数2:指定したタグ名で文字列を囲む (今回のメイン)
' =================================================================
Function WrapWithTag(ByVal tagName As String, ByVal content As String) As String
' タグ名が空の場合は、コンテンツをそのまま返す
If tagName = "" Then
WrapWithTag = content
Exit Function
End If
WrapWithTag = "<" & tagName & ">" & content & "</" & tagName & ">"
End Function
' =================================================================
' 実行デモ:B列の値をC列のタグで囲み、D列に出力する
' =================================================================
Sub Demo_CreateHtmlElements()
Dim dataCell As Range
Dim content As String
Dim tagName As String
' B2からB4セルをループ
For Each dataCell In ThisWorkbook.Worksheets("Sheet1").Range("B2:B4")
' B列からコンテンツ、C列からタグ名を取得
content = dataCell.Value
tagName = dataCell.Offset(0, 1).Value
' 2つの関数を組み合わせて、D列に結果を出力
' 1. EncodeToHtmlでコンテンツを安全にし、
' 2. WrapWithTagでタグ付けする
dataCell.Offset(0, 2).Value = WrapWithTag(tagName, EncodeToHtml(content))
Next dataCell
MsgBox "HTML要素の生成が完了しました。"
End Sub
処理の流れとコード解説
① サンプルデータ
このコードは、以下のようなSheet1
のデータを処理することを想定しています。B列にHTMLにしたい内容、C列に使用したいタグ名を入力しておきます。
(A) | (B) コンテンツ | (C) タグ名 | (D) 生成結果(ここに表示) |
1 | 内容 | タグ | 結果 |
2 | メインタイトル | h1 | <h1>メインタイトル</h1> |
3 | タグの例: <p> | p | <p>タグの例: <p></p> |
4 | 1行目<br>2行目 | div | <div>1行目<br />2行目</div> |
Google スプレッドシートにエクスポート
② タグで囲む関数 (WrapWithTag)
Function WrapWithTag(ByVal tagName As String, ByVal content As String) As String
WrapWithTag = "<" & tagName & ">" & content & "</" & tagName & ">"
End Function
この関数は非常にシンプルです。引数として受け取ったtagName
とcontent
を、&
演算子で連結して<{tagName}>{content}</{tagName}>
という形式の文字列を作成して返します。このような単純な処理も関数化することで、コードの再利用性が高まり、可読性も向上します。
③ 2つの関数の組み合わせ
dataCell.Offset(0, 2).Value = WrapWithTag(tagName, EncodeToHtml(content))
デモプロシージャ内のこの一行が、今回の処理の核心です。VBAでは、関数の中に関数を入れ子にして、処理をスムーズに繋げることができます。
ここでは、以下の順序で処理が実行されます。
- まず内側の
EncodeToHtml(content)
が実行され、Excelセルから取得した元の文字列(content
)が安全な形式にエスケープされます。 - 次に、そのエスケープ済みの文字列が、外側の
WrapWithTag
関数のcontent
引数として渡されます。 - 最終的に
WrapWithTag
関数が、安全なコンテンツを動的に取得したタグ名(tagName
)で囲み、完成したHTML文字列を返します。
この**「関数の組み合わせ(合成)」**は、複雑な処理をシンプルに記述するための非常に重要なプログラミング技術です。
まとめ
「特殊文字をエスケープする」「タグで囲む」といったように、一つ一つの処理を独立した小さな関数として作成することで、コードの組み合わせが自由になり、非常に柔軟でメンテナンスしやすいプログラムを構築できます。
特にHTML生成においては、このEncodeToHtml
関数とWrapWithTag
関数を組み合わせることで、Excel上のあらゆるデータを安全かつ動的にHTML要素へ変換することが可能になります。