Excelのセルに入力されたテキストをVBAでHTMLファイルに出力する際、>
や <
、&
といった文字がセルに含まれていると、HTMLのタグと誤認されてしまい、表示が崩れる「文字化け」ならぬ「タグ化け」が起きてしまいます。
これを防ぐには、これらの特殊文字を>
や<
、&
といった「文字実体参照」に変換するエスケープ処理が必要です。
この記事では、一つ一つ文字を置換する面倒な方法ではなく、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
関数を使って&
を&
に、<
を<
に…と自前で置換していくのは、順序を間違えると二重置換が起きるなど、非常に手間がかかりミスも起きやすくなります。
しかし、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生成タスクで役立つ、非常に便利な関数です。