見出し画像

ExcelVBAで選択範囲のURLに一括でハイパーリンクを設定する

ExcelのセルにURLがある場合に、ハイパーリンクを設定したいときは、URLを入力したセルをF2で編集モードにして何も編集せずにEnterすれば、自動的にハイパーリンクが設定できます。
しかし、下記画像例のようにハイパーリンクを設定したいURLを含むセルが複数ある場合は、セルの1つ1つをF2で編集モードにしてEnterするのは大変ですよね。

Qiita記事のアクセス数を集計したPowerQuery

そんなときは、URL化したいセル範囲を選択しながら、下記のコードを実行します。

URLを含むセルを範囲選択した状態でマクロを実行

コードはこちらです。

Sub sb選択範囲のURLをリンクにする()
' アクティブシートの選択範囲内のセルに含まれるURLをハイパーリンクに変換する処理
    
    Dim rngSelected As Range ' 選択範囲を格納する変数
    Dim cell As Range ' 各セルを処理するための変数
    Dim strURL As String ' セル内のURLを格納する変数
    Dim ws As Worksheet ' アクティブシートを格納する変数
    
    ' アクティブシートを取得
    Set ws = ActiveSheet
    
    ' 選択範囲を取得
    Set rngSelected = Selection
    
    ' 選択範囲の各セルをループ処理
    For Each cell In rngSelected
        ' セルの内容がURL形式か確認
        strURL = CStr(cell.Value) ' セルの値を文字列として取得
        If zfIsURLValid(strURL) Then
            ' URLが有効な場合、そのセルにハイパーリンクを設定
            ws.Hyperlinks.Add Anchor:=cell, Address:=strURL, TextToDisplay:=strURL
        End If
    Next cell
    
    Dim myMsg As String 'メッセージボックス用変数
    myMsg = "処理が終了しました。"
    MsgBox myMsg, , "処理結果通知"

End Sub

Function zfIsURLValid(ByVal a_strURL As String) As Boolean
' URLが有効かを確認する関数
' 簡易的なURL形式のチェックを行う
    
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    
    ' URLの正規表現パターンを設定
    With regex
        .Pattern = "^https?://[^\s/$.?#].[^\s]*$"
        .IgnoreCase = True
        .Global = False
    End With
    
    ' URLが正規表現に一致するかを確認
    zfIsURLValid = regex.Test(a_strURL)
End Function

実行結果は下記のようになります。

一括でURLを含むセルがハイパーリンクが設定された

ちなみにハイパーリンクの一括削除は、該当のセルを範囲選択した状態で右クリックすると、「ハイパーリンクの削除」ボタンがあるので、それでVBAを使わなくても一括削除できます。
ハイパーリンクが設定されたセルを選択しているのに右クリックしても「ハイパーリンクの削除」ボタンがなぜか出ていない場合は、ハイパーリンクの書式(青字、アンダーライン等)のみが残っている可能性があります。

なお、こちらのコードはこちらの有料記事(【無料部分あり】ExcelVBAコードを生成するプロンプトのコツと解説(全19項目))で紹介しているプロンプトでchatGPTで作成しました。

【補足1】

ハイパーリンクを設定したのがPowerQueryでデータ加工してテーブルに呼び出している列の場合は、データ更新した際にハイパーリンク設定が消えてしまうようです。(アンダーラインやフォントカラー等の書式設定は残ります。)
そのため、PowerQueryでデータ加工してテーブルに呼び出しているURLに、都度ハイパーリンクを設定したい場合には、そのブックをマクロ有効ブックに変更して問題ないのであれば、クラスモジュールでクエリ更新時のイベントプロシージャを利用してURLへのハイパーリンクを設定をするようにできます。
参考:クエリ更新時のイベントプロシージャ
ただし、そのようにする場合は、選択範囲のURLに対してハイパーリンクを設定するのではなく、テーブルの特定列に設定するというコードに書き換えます。

【補足2】

VBAを使用せずに、ワークシート関数のHYPERLINK関数を使用して一括でハイパーリンクを設定する方法もあります。
ただし、HYPERLINK関数の場合には、既存のURLが入力された列とは別の列を挿入してHYPERLINK関数を挿入する形になります。(表示文字列は変更可能)

HYPERLINK関数を使用する場合

前述の、ハイパーリンクを設定したのが、PowerQueryでデータ加工してテーブルに呼び出しているテーブルの列の場合は、こちらの方法の方が良いかもしれません。
ただし、HYPERLINK関数で表示文字列を指定しないと全く同じURLを表示する列が2つになるので、表示文字列は短く端的に指定するとよいでしょう。

もしよろしければサポートをお願いします。今後の執筆のかてにします。