【Excel VBA】HTMLの特殊文字をエスケープ処理する最強の関数

Excelのセルに入力されたテキストをVBAでHTMLファイルに出力する際、><& といった文字がセルに含まれていると、HTMLのタグと誤認されてしまい、表示が崩れる「文字化け」ならぬ「タグ化け」が起きてしまいます。

これを防ぐには、これらの特殊文字を&gt;&lt;&amp;といった「文字実体参照」に変換するエスケープ処理が必要です。

この記事では、一つ一つ文字を置換する面倒な方法ではなく、XMLパーサーを利用して、あらゆる特殊文字を一度で安全にエスケープする、非常に強力でスマートなVBAカスタム関数をご紹介します。


目次

完成したVBA関数と使用例

まず、完成した関数(EncodeToHtml)と、それを使って実際にセルB列にエスケープ後の文字列を書き出すデモプロシージャです。

' HTMLエスケープ処理を行うメインの関数
Function EncodeToHtml(ByVal inputText As String) As String

    ' 変数を宣言
    Dim dom As Object
    Dim outputText As String

    ' MSXML2.DOMDocumentオブジェクトを生成
    Set dom = CreateObject("MSXML2.DOMDocument.6.0")
    
    ' 1. ダミーのXML要素を読み込む
    dom.LoadXML "<temp_node />"
    
    ' 2. 要素のテキストとして入力文字列を設定(ここで自動的にエスケープされる)
    dom.FirstChild.Text = inputText
    
    ' 3. エスケープされたテキストを取得
    outputText = dom.FirstChild.FirstChild.xml
    
    ' 4. VBAの改行コードをHTMLの<br />タグに変換
    EncodeToHtml = Replace(outputText, vbCrLf, "<br />")
    
    ' オブジェクトを解放
    Set dom = Nothing

End Function


' 上記のEncodeToHtml関数を使うデモ用のプロシージャ
Sub Demo_HtmlEncoding()
    Dim targetCell As Range
    
    ' B2からB4セルの値を、HTMLエスケープしてC列に出力する
    For Each targetCell In ThisWorkbook.Worksheets("Sheet1").Range("B2:B4")
        ' 隣のセル(C列)に変換後の文字列を書き出す
        targetCell.Offset(0, 1).Value = EncodeToHtml(targetCell.Value)
    Next targetCell
    
    MsgBox "HTMLエスケープ処理が完了しました。"
End Sub

コードのポイント解説

① なぜXMLオブジェクトを使うのか? (この関数の核心)

この関数の最も賢い点は、面倒なエスケープ処理をXMLオブジェクトに丸投げしていることです。

Replace関数を使って&&amp;に、<&lt;に…と自前で置換していくのは、順序を間違えると二重置換が起きるなど、非常に手間がかかりミスも起きやすくなります。

しかし、XMLやHTMLを解釈するための専門部品であるMSXML2.DOMDocumentオブジェクトは、特殊文字の扱いを完璧に心得ています。

dom.FirstChild.Text = inputText

この一行で、入力された文字列(inputText)をXML要素のテキストとして設定する際に、DOMエンジンが内部で自動的に、かつ正確に、すべての特殊文字をエスケープしてくれます。

② なぜ「.FirstChild.FirstChild」なのか?

outputText = dom.FirstChild.FirstChild.xml

エスケープされた文字列を取り出す際の.FirstChild.FirstChildは、XMLの階層構造(DOMツリー)を表しています。

  • dom: CreateObjectで作った、XML文書全体。
  • .FirstChild: LoadXML "<temp_node />"で作成した、最初の要素である<temp_node>
  • .FirstChild.FirstChild: <temp_node>要素に.Textプロパティで文字列を設定した際に、その文字列を格納するために自動的に作成された「テキストノード」

この「テキストノード」の.xmlプロパティを読み出すことで、安全にエスケープされた純粋な文字列が取得できる、という仕組みです。

③ 改行コードの変換

EncodeToHtml = Replace(outputText, vbCrLf, "<br />")

XMLパーサーは特殊文字をエスケープしてくれますが、VBAの改行コード(vbCrLf)はそのまま出力します。HTMLで改行を表示させるには改行タグ<br />が必要なため、関数の最後にReplace関数を使ってこの変換を行っています。


まとめ

HTMLをVBAで生成する際の特殊文字エスケープは、バグの温床になりがちな厄介な処理です。

今回紹介したEncodeToHtml関数は、その処理を専門家であるXMLパーサーに任せることで、手作業による置換漏れやミスを防ぎ、非常に安全かつ確実に文字列をHTML化します。

一度ご自身のVBAプロジェクトに追加しておけば、あらゆるHTML生成タスクで役立つ、非常に便利な関数です。

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

この記事を書いた人

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

目次