【Excel VBA】動的なタグ名でHTML要素を作成する自作関数

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>タグの例: &lt;p&gt;</p>
41行目<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

この関数は非常にシンプルです。引数として受け取ったtagNamecontentを、&演算子で連結して<{tagName}>{content}</{tagName}>という形式の文字列を作成して返します。このような単純な処理も関数化することで、コードの再利用性が高まり、可読性も向上します。

③ 2つの関数の組み合わせ

dataCell.Offset(0, 2).Value = WrapWithTag(tagName, EncodeToHtml(content))

デモプロシージャ内のこの一行が、今回の処理の核心です。VBAでは、関数の中に関数を入れ子にして、処理をスムーズに繋げることができます。

ここでは、以下の順序で処理が実行されます。

  1. まず内側のEncodeToHtml(content)が実行され、Excelセルから取得した元の文字列(content)が安全な形式にエスケープされます。
  2. 次に、そのエスケープ済みの文字列が、外側のWrapWithTag関数のcontent引数として渡されます。
  3. 最終的にWrapWithTag関数が、安全なコンテンツを動的に取得したタグ名(tagName)で囲み、完成したHTML文字列を返します。

この**「関数の組み合わせ(合成)」**は、複雑な処理をシンプルに記述するための非常に重要なプログラミング技術です。


まとめ

「特殊文字をエスケープする」「タグで囲む」といったように、一つ一つの処理を独立した小さな関数として作成することで、コードの組み合わせが自由になり、非常に柔軟でメンテナンスしやすいプログラムを構築できます。

特にHTML生成においては、このEncodeToHtml関数とWrapWithTag関数を組み合わせることで、Excel上のあらゆるデータを安全かつ動的にHTML要素へ変換することが可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次