【Excel VBA】ハイパーリンク(aタグ)を動的に作成する自作関数

VBAでHTMLを生成する際、単なるテキストだけでなく、クリック可能なハイパーリンク(<a>タグ)を作成したい場面は頻繁にあります。ハイパーリンクは、<a href="リンク先URL">表示テキスト</a>のように、hrefという属性を持つのが特徴です。

この記事では、これまでの記事で作成した関数をさらに応用し、HTML要素に任意の属性を追加する新しい関数を導入して、最終的に完全なハイパーリンクを動的に生成するテクニックを解説します。


目次

完成したVBAコード(3つの関数と実行デモ)

今回の目的を達成するため、これまで作成したEncodeToHtmlWrapWithTagに加え、新たに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テキストURLHTML結果
2Googleで検索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要素の文字列を引数として受け取ります。

  1. dom.LoadXMLで、その文字列をXMLオブジェクトとしてメモリに読み込みます。
  2. .setAttributeメソッドを使い、読み込んだ要素に新しい属性(例: href)と、その値(例: URL)を設定します。
  3. 最後に、属性が追加された新しいHTML要素の文字列を.xmlプロパティから取得し、関数の戻り値として返します。

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

AddAttribute( _
    WrapWithTag("a", EncodeToHtml(linkText)), _
    "href", _
    linkUrl _
)

このコードは、これまで作成した自作関数をパイプラインのように繋げて、最終的な成果物を作り上げています。処理は内側から外側へと実行されます。

  1. EncodeToHtml(linkText): まず、表示テキストに含まれるかもしれない特殊文字を安全にエスケープします。
  2. WrapWithTag("a", ...): 次に、エスケープ済みの安全なテキストを<a>タグで囲み、基本的な要素を作成します。(例: <a>Googleで検索</a>
  3. AddAttribute(..., "href", linkUrl): 最後に、出来上がった<a>要素に、href属性としてURLを追加し、完全なハイパーリンク(<a href="...">...</a>)を完成させます。

このように、小さな機能を持つ関数を複数作り、それらを組み合わせることで、複雑な処理も非常に見通しよく、かつ安全に実装することができます。


まとめ

ハイパーリンクの生成は、HTML作成において避けては通れない処理です。

今回紹介したように、**「コンテンツを安全にする」「タグで囲む」「属性を追加する」**という3つのステップに処理を分割し、それぞれを独立した関数として用意することで、コードの再利用性が劇的に向上します。

このモジュール的なアプローチは、VBAに限らず、あらゆるプログラミングにおいて非常に重要な考え方です。

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

この記事を書いた人

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

目次