VBAでHTMLを生成する際、単なるテキストだけでなく、クリック可能なハイパーリンク(<a>
タグ)を作成したい場面は頻繁にあります。ハイパーリンクは、<a href="リンク先URL">表示テキスト</a>
のように、href
という属性を持つのが特徴です。
この記事では、これまでの記事で作成した関数をさらに応用し、HTML要素に任意の属性を追加する新しい関数を導入して、最終的に完全なハイパーリンクを動的に生成するテクニックを解説します。
完成したVBAコード(3つの関数と実行デモ)
今回の目的を達成するため、これまで作成したEncodeToHtml
、WrapWithTag
に加え、新たにAddAttribute
という関数を使います。以下に、3つのヘルパー関数と、それらを使ってハイパーリンクを生成するデモプロシージャの全コードを掲載します。
' =================================================================
' 関数1:HTMLの特殊文字をエスケープ処理する
' =================================================================
Function EncodeToHtml(ByVal inputText As String) As String
Dim dom As Object
Set dom = CreateObject("MSXML2.DOMDocument.6.0")
dom.LoadXML "<temp />"
dom.FirstChild.Text = inputText
EncodeToHtml = Replace(dom.FirstChild.FirstChild.xml, vbCrLf, "<br />")
Set dom = Nothing
End Function
' =================================================================
' 関数2:指定したタグ名で文字列を囲む
' =================================================================
Function WrapWithTag(ByVal tagName As String, ByVal content As String) As String
WrapWithTag = "<" & tagName & ">" & content & "</" & tagName & ">"
End Function
' =================================================================
' 関数3:HTML要素の文字列に属性を追加する (今回のメイン)
' =================================================================
Function AddAttribute(ByVal elementString As String, ByVal attrName As String, ByVal attrValue As String) As String
Dim dom As Object
Set dom = CreateObject("MSXML2.DOMDocument.6.0")
' 引数で渡された要素の文字列をXMLとして読み込む
dom.LoadXML elementString
' その要素に属性を設定
dom.FirstChild.setAttribute attrName, attrValue
' 属性が追加された要素のHTML文字列を返す
AddAttribute = dom.FirstChild.xml
Set dom = Nothing
End Function
' =================================================================
' 実行デモ:B列のテキストとC列のURLから、D列に<a>タグを生成する
' =================================================================
Sub Demo_CreateHyperlinks()
Dim targetCell As Range
Dim linkText As String
Dim linkUrl As String
For Each targetCell In ThisWorkbook.Worksheets("Sheet1").Range("B2:B3")
' B列から表示テキスト、C列からURLを取得
linkText = targetCell.Value
linkUrl = targetCell.Offset(0, 1).Value
' 3つの関数を組み合わせて、D列に結果を出力
targetCell.Offset(0, 2).Value = _
AddAttribute( _
WrapWithTag("a", EncodeToHtml(linkText)), _
"href", _
linkUrl _
)
Next targetCell
MsgBox "ハイパーリンクの生成が完了しました。"
End Sub
処理の流れとコード解説
① サンプルデータ
このコードは、Sheet1
に以下のようなデータが用意されていることを想定しています。
(A) | (B) 表示テキスト | (C) リンク先URL | (D) 生成結果(ここに表示) |
1 | テキスト | URL | HTML結果 |
2 | Googleで検索 | https://www.google.com | <a href="https://www.google.com">Googleで検索</a> |
3 | マイクロソフト公式サイト | https://www.microsoft.com | <a href="https://www.microsoft.com">マイクロソフト公式サイト</a> |
Google スプレッドシートにエクスポート
② 属性を追加する新関数 (AddAttribute)
Function AddAttribute(...)
dom.LoadXML elementString
dom.FirstChild.setAttribute attrName, attrValue
AddAttribute = dom.FirstChild.xml
End Function
この新しい関数は、<a>テキスト</a>
のようなHTML要素の文字列を引数として受け取ります。
dom.LoadXML
で、その文字列をXMLオブジェクトとしてメモリに読み込みます。.setAttribute
メソッドを使い、読み込んだ要素に新しい属性(例:href
)と、その値(例: URL)を設定します。- 最後に、属性が追加された新しいHTML要素の文字列を
.xml
プロパティから取得し、関数の戻り値として返します。
③ 3つの関数の組み合わせ
AddAttribute( _
WrapWithTag("a", EncodeToHtml(linkText)), _
"href", _
linkUrl _
)
このコードは、これまで作成した自作関数をパイプラインのように繋げて、最終的な成果物を作り上げています。処理は内側から外側へと実行されます。
EncodeToHtml(linkText)
: まず、表示テキストに含まれるかもしれない特殊文字を安全にエスケープします。WrapWithTag("a", ...)
: 次に、エスケープ済みの安全なテキストを<a>
タグで囲み、基本的な要素を作成します。(例:<a>Googleで検索</a>
)AddAttribute(..., "href", linkUrl)
: 最後に、出来上がった<a>
要素に、href
属性としてURLを追加し、完全なハイパーリンク(<a href="...">...</a>
)を完成させます。
このように、小さな機能を持つ関数を複数作り、それらを組み合わせることで、複雑な処理も非常に見通しよく、かつ安全に実装することができます。
まとめ
ハイパーリンクの生成は、HTML作成において避けては通れない処理です。
今回紹介したように、**「コンテンツを安全にする」「タグで囲む」「属性を追加する」**という3つのステップに処理を分割し、それぞれを独立した関数として用意することで、コードの再利用性が劇的に向上します。
このモジュール的なアプローチは、VBAに限らず、あらゆるプログラミングにおいて非常に重要な考え方です。