ExcelVBAで選択範囲のURLに一括でハイパーリンクを設定する
ExcelのセルにURLがある場合に、ハイパーリンクを設定したいときは、URLを入力したセルをF2で編集モードにして何も編集せずにEnterすれば、自動的にハイパーリンクが設定できます。
しかし、下記画像例のようにハイパーリンクを設定したいURLを含むセルが複数ある場合は、セルの1つ1つをF2で編集モードにしてEnterするのは大変ですよね。
そんなときは、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
実行結果は下記のようになります。
ちなみにハイパーリンクの一括削除は、該当のセルを範囲選択した状態で右クリックすると、「ハイパーリンクの削除」ボタンがあるので、それでVBAを使わなくても一括削除できます。
ハイパーリンクが設定されたセルを選択しているのに右クリックしても「ハイパーリンクの削除」ボタンがなぜか出ていない場合は、ハイパーリンクの書式(青字、アンダーライン等)のみが残っている可能性があります。
なお、こちらのコードはこちらの有料記事(【無料部分あり】ExcelVBAコードを生成するプロンプトのコツと解説(全19項目))で紹介しているプロンプトでchatGPTで作成しました。
【補足1】
ハイパーリンクを設定したのがPowerQueryでデータ加工してテーブルに呼び出している列の場合は、データ更新した際にハイパーリンク設定が消えてしまうようです。(アンダーラインやフォントカラー等の書式設定は残ります。)
そのため、PowerQueryでデータ加工してテーブルに呼び出しているURLに、都度ハイパーリンクを設定したい場合には、そのブックをマクロ有効ブックに変更して問題ないのであれば、クラスモジュールでクエリ更新時のイベントプロシージャを利用してURLへのハイパーリンクを設定をするようにできます。
参考:クエリ更新時のイベントプロシージャ
ただし、そのようにする場合は、選択範囲のURLに対してハイパーリンクを設定するのではなく、テーブルの特定列に設定するというコードに書き換えます。
【補足2】
VBAを使用せずに、ワークシート関数のHYPERLINK関数を使用して一括でハイパーリンクを設定する方法もあります。
ただし、HYPERLINK関数の場合には、既存のURLが入力された列とは別の列を挿入してHYPERLINK関数を挿入する形になります。(表示文字列は変更可能)
前述の、ハイパーリンクを設定したのが、PowerQueryでデータ加工してテーブルに呼び出しているテーブルの列の場合は、こちらの方法の方が良いかもしれません。
ただし、HYPERLINK関数で表示文字列を指定しないと全く同じURLを表示する列が2つになるので、表示文字列は短く端的に指定するとよいでしょう。
もしよろしければサポートをお願いします。今後の執筆のかてにします。