【VBA】セルの値からハイパーリンクを一括作成する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

セルに入力されたURLやファイルパスに、1つずつ右クリック→「ハイパーリンクの挿入」で設定していませんか? 10件くらいなら我慢できますが、100件、200件となると気が遠くなります。

以前の自分がまさにそうでした。取引先から届いたファイル一覧表に、各ファイルのパスが200行分入っていて、「これ全部にリンク貼っておいて」と頼まれたことがあります。1件ずつ右クリック→ハイパーリンクの挿入→パスを貼り付け……200回繰り返す作業で、半日つぶれました。

「これ、VBAで一発でできないかな」と思って調べたのがきっかけです。結果、Hyperlinks.Add というメソッドを使えば、セルの値をそのままリンク先に指定して一括でハイパーリンクを作成できることがわかりました。

この記事のVBAを使えば、セルに入力されたURL・ファイルパス・メールアドレスからハイパーリンクを一括作成できます。

  • 対象:ハイパーリンクを手作業で設定している人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約5分(目安)

どんな場面で使う?

ハイパーリンクの一括作成が特に活躍するのは、こんな場面です。

  • ファイル一覧表にリンクを設定するフォルダ内のファイル一覧を取得してExcelに出力した後、各ファイルのパスにリンクを貼ればワンクリックでファイルを開ける管理台帳が完成する
  • 取引先のWebサイト一覧にリンクを設定する — 顧客管理シートのURL列に対して、一括でハイパーリンクを設定すれば、いちいちブラウザにURLをコピペしなくて済む
  • 社内文書の目次シートを作る — 関連ファイルへのリンクを並べた目次シートがあると、プロジェクト資料の管理が格段に楽になる
  • メールアドレス一覧にメール送信リンクを設定する — 連絡先一覧のメールアドレスにmailtoリンクを貼れば、クリックだけでメーラーが起動する
  • 報告書に参照先ファイルのリンクを添付する — エビデンスとなるファイルのパスを報告書に記載し、リンクから直接開けるようにしておくと確認作業が捗る

完成イメージ(Before / After)

Before(実行前)

A列にURLやファイルパスがテキストとして入力されている。リンクは設定されていないため、クリックしても何も起きない。

A(リンク先)
1 リンク先
2 https://example.com/page1
3 https://example.com/page2
4 C:\資料\報告書.xlsx
5 user@example.com

After(実行後)

A(リンク先)
1 リンク先
2 https://example.com/page1
3 https://example.com/page2
4 C:\資料\報告書.xlsx
5 user@example.com

各セルにハイパーリンクが設定され、クリックするとWebページが開いたり、ファイルが開いたり、メール作成画面が立ち上がったりします。実際の画面では、セルの文字が青色になり下線が付きます。

手順(コピペ → 実行まで約5分)

Excelファイルをマクロ有効ブックで保存する

  1. Excelを開く(新規でも既存でもOK)
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(基本版)」をコピーして、コードウィンドウに貼り付ける
  2. コード内のセル範囲を自分の環境に合わせて書き換える
  3. Alt + F8 を押す(または VBE上で F5
  4. マクロ名を選択して「実行」
  5. セルにハイパーリンクが設定されていることを確認する(文字が青くなり下線が付く)

コード(基本版)— セルのURLにハイパーリンクを設定

まずはこれだけで動く。A列に入力されたURLに対して、ハイパーリンクを一括設定する。


Sub AddHyperlinksFromCells()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim linkAddress As String
    Dim linkCount As Long

    Set ws = Worksheets("Sheet1")

    ' A列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    linkCount = 0

    ' A列を1行ずつ処理(2行目から:1行目はヘッダー)
    For i = 2 To lastRow
        linkAddress = Trim(ws.Cells(i, 1).Value)

        ' 空白セルはスキップ
        If linkAddress = "" Then GoTo NextRow

        ' ハイパーリンクを追加
        ws.Hyperlinks.Add _
            Anchor:=ws.Cells(i, 1), _
            Address:=linkAddress, _
            TextToDisplay:=linkAddress

        linkCount = linkCount + 1

NextRow:
    Next i

    MsgBox linkCount & " 件のハイパーリンクを作成しました。", vbInformation

End Sub

ポイント:

  • Anchor にリンクを設定するセルを指定する。Anchor は「リンクをどのセルに付けるか」を決める引数で、省略できません
  • Address にリンク先のURLを指定する(セルの値をそのまま使用)。ここに渡す文字列がそのままリンク先になるため、セルの値が正しいURLやパスであることが前提です
  • TextToDisplay でセルに表示するテキストを指定する。省略するとAddressの値がそのまま表示されます。ファイル名だけを表示したい場合は Dir(linkAddress) でファイル名だけを取り出して渡すのも便利です
  • Trim で前後の空白を除去し、余計なスペースによるリンク切れを防ぐ。CSVからインポートしたデータには前後にスペースが混入していることがよくあるので、Trim は必ず入れておくのがおすすめです

シート名について:コード内の "Sheet1" はシートのタブに表示される名前です。シート名を変更している場合は、自分のシート名に書き換えてください。

コード(応用版)— ファイルパスへのリンク・メールリンク

URLだけでなく、ローカルファイルへのリンクやメールリンクにも対応する。セルの値を自動判定して、適切なリンクを設定する。


Sub AddHyperlinksAuto()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim cellValue As String
    Dim linkAddress As String
    Dim linkCount As Long

    Set ws = Worksheets("Sheet1")

    ' A列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    linkCount = 0

    For i = 2 To lastRow
        cellValue = Trim(ws.Cells(i, 1).Value)

        ' 空白セルはスキップ
        If cellValue = "" Then GoTo NextRow

        ' セルの値に応じてリンク先を判定
        If cellValue Like "http*" Then
            ' URLの場合:そのままリンク
            linkAddress = cellValue

        ElseIf cellValue Like "*@*.*" Then
            ' メールアドレスの場合:mailto: を付加
            linkAddress = "mailto:" & cellValue

        ElseIf Dir(cellValue) <> "" Then
            ' ファイルパスの場合:ファイルが存在すればリンク
            linkAddress = cellValue

        Else
            ' どれにも該当しない場合はスキップ
            ws.Cells(i, 2).Value = "リンク対象外"
            GoTo NextRow
        End If

        ' ハイパーリンクを追加
        ws.Hyperlinks.Add _
            Anchor:=ws.Cells(i, 1), _
            Address:=linkAddress, _
            TextToDisplay:=cellValue

        linkCount = linkCount + 1

NextRow:
    Next i

    MsgBox linkCount & " 件のハイパーリンクを作成しました。", vbInformation

End Sub

ポイント:

  • Like "http*" でURLを判定する(http:// と https:// の両方に対応)。Like 演算子はワイルドカードを使った簡易パターンマッチングで、厳密なURL検証ではないが実用上は十分です
  • Like "*@*.*" でメールアドレスを判定する(簡易的な判定のため、URLの判定を先に行い誤判定を防止)。判定の順番が重要で、URL判定を先にしないと http://user@example.com のようなURLがメールアドレスと誤判定される可能性があります
  • Dir(cellValue) <> "" でファイルの存在を確認してからリンクを設定する。ファイルが存在しないパスにリンクを貼ると、クリック時に「ファイルが見つかりません」エラーになるため、事前チェックは必須です。ファイル存在確認の詳細はファイルやフォルダの存在を確認してから処理する方法を参照
  • どのパターンにも該当しない場合はB列に「リンク対象外」と記録してスキップ。処理結果が残るので、後から「なぜリンクされなかったか」を確認できます
  • メールアドレスには自動で mailto: を付加する

メールリンクに件名を付けたい場合:


' 件名付きメールリンクの例
linkAddress = "mailto:" & cellValue & "?subject=お問い合わせ"

フォルダへのリンクを設定したい場合: ファイルパスの代わりにフォルダパスを入力すると、クリックでエクスプローラーが開きます。フォルダの存在チェックには Dir(cellValue, vbDirectory) <> "" を使ってください。

コード(実務版)— 一覧表のファイルパスに一括リンク設定

実務で一番使うパターン。ファイル一覧表のパス列に対して、ファイルの存在チェック付きでハイパーリンクを一括設定する。

シートの準備:

A(ファイル名) B(ファイルパス) C(ステータス)
1 ファイル名 ファイルパス ステータス
2 報告書.xlsx C:\資料\報告書.xlsx ← 自動記入
3 見積書.xlsx C:\資料\見積書.xlsx ← 自動記入
4 請求書.pdf C:\資料\請求書.pdf ← 自動記入

A列にファイル名、B列にフルパスが入力されている。B列にハイパーリンクを設定し、C列に結果(リンク済み/ファイルなし)を記録する。

繰り返し実行する場合: マクロを再実行すると既存のハイパーリンクが上書きされます。リンクを削除してやり直したい場合は、下にある DeleteAllHyperlinks マクロを先に実行してください。


Sub AddHyperlinksToFileList()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim filePath As String
    Dim fileName As String
    Dim linkCount As Long
    Dim skipCount As Long

    Set ws = Worksheets("Sheet1")

    ' B列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row

    ' 画面更新を一時停止(高速化)
    Application.ScreenUpdating = False

    linkCount = 0
    skipCount = 0

    ' C列のヘッダーを設定
    ws.Cells(1, 3).Value = "ステータス"

    ' B列を1行ずつ処理(2行目から)
    For i = 2 To lastRow
        filePath = Trim(ws.Cells(i, 2).Value)
        fileName = ws.Cells(i, 1).Value

        ' ファイルパスが空欄ならスキップ
        If filePath = "" Then
            ws.Cells(i, 3).Value = "パス未入力"
            GoTo NextRow
        End If

        ' リンク済みセルをスキップする場合はこの行のコメントを外す
        ' If ws.Cells(i, 2).Hyperlinks.Count > 0 Then GoTo NextRow

        ' ファイルの存在チェック
        If Dir(filePath) = "" Then
            ws.Cells(i, 3).Value = "ファイルなし"
            ws.Cells(i, 3).Font.Color = RGB(255, 0, 0)
            skipCount = skipCount + 1
            GoTo NextRow
        End If

        ' ハイパーリンクを追加(表示テキストはファイルパス)
        ws.Hyperlinks.Add _
            Anchor:=ws.Cells(i, 2), _
            Address:=filePath, _
            TextToDisplay:=filePath

        ws.Cells(i, 3).Value = "リンク済み"
        ws.Cells(i, 3).Font.Color = RGB(0, 128, 0)

        linkCount = linkCount + 1

NextRow:
    Next i

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "完了:" & linkCount & " 件リンク作成 / " & skipCount & " 件スキップ", vbInformation

End Sub

ポイント:

  • B列のファイルパスにハイパーリンクを設定し、クリックでファイルが開ける
  • Dir(filePath) でファイルの存在を事前にチェックする
  • C列に結果を記録する(「リンク済み」は緑、「ファイルなし」は赤で表示)
  • Application.ScreenUpdating = False で画面更新を止めて高速化
  • パスが空欄のセルは「パス未入力」と記録してスキップ
  • リンク済みセルのスキップはコメントアウトで用意済み(必要に応じて有効化)

シート上のハイパーリンクを全削除してやり直す場合:


Sub DeleteAllHyperlinks()
    ActiveSheet.Hyperlinks.Delete
    MsgBox "全てのハイパーリンクを削除しました。", vbInformation
End Sub

よくある落とし穴5選

# 症状 原因 対策
1 リンクをクリックしても「ファイルが見つかりません」 ファイルパスが間違っている、またはファイルが移動・削除された エクスプローラーで対象ファイルを右クリック→「パスのコピー」で正確なパスを取得する
2 リンクの文字色が青にならない セルの文字色を手動で設定しているため、ハイパーリンクの既定色が上書きされている セルの書式設定→フォント色を「自動」に変更する
3 既存のハイパーリンクが消えた Hyperlinks.Add を同じセルに再実行すると既存リンクが上書きされる 再実行する前に意図した動作か確認する。必要に応じてリンク済みセルをスキップする条件を追加する
4 マクロを保存したのに次回開くと消えている .xlsx で保存してしまった 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する
5 URLにスペースが含まれていてリンクが途切れる セルの値に前後の空白や途中のスペースが含まれている Trim で前後の空白を除去する。URL内のスペースは Replace(linkAddress, " ", "%20") で置換する
6 大量のリンク(数千件)を設定すると処理が遅い ループ内で毎回画面更新が走っている Application.ScreenUpdating = False を処理前に入れて画面更新を止める。実務版コードではこの対策が組み込み済み。処理時間が気になる場合は処理時間計測で計測してみてください

VBAでハイパーリンクが作成できないエラーの対処法

「Hyperlinks.Addを実行すると実行時エラーが出る」という場合、原因はAddress引数に渡している文字列が空白、または不正なパスになっていることが多い。セルの値が空の行でHyperlinks.Addを実行するとエラーになる。対処法はループ内で If linkAddress = "" Then GoTo NextRow のように空白チェックを入れること。また、URLの前後に見えないスペースが混入していることもあるので、Trim() で前後の空白を除去してから渡すのが安全だ。自分もCSVから取り込んだURLリストで前後にスペースが入っていてリンクが動かなかった経験がある。

VBAのHyperlinks.Addが動かないときの対処法

「コードを実行してもハイパーリンクが設定されず、セルの文字も青くならない」という場合、原因はAnchor引数に指定したセルが正しくないか、セルの文字色が手動で黒に設定されていることが考えられる。Anchor引数はリンクを付けるセルそのものを指定する必要があり、省略するとエラーになる。文字色が青くならない場合は、セルの書式設定でフォント色が「自動」以外に固定されている。フォント色を「自動」に戻せばハイパーリンクの既定色(青)が適用される。もう1つよくあるのは、Worksheets("Sheet1") のシート名が実際と違うケース。シート名を正確に確認すること。

FAQ

Q1: ハイパーリンクを一括削除するには?

上記の DeleteAllHyperlinks マクロを実行すると、シート上の全ハイパーリンクを一括削除できます。特定の範囲だけ削除したい場合は Range("A2:A100").Hyperlinks.Delete のように範囲を指定してください。

Q2: A列にURL、B列に表示テキストを設定したい

Hyperlinks.AddTextToDisplay 引数にB列の値を指定します。例:TextToDisplay:=ws.Cells(i, 2).Value。実務版コードの TextToDisplay を書き換えれば対応できます。

Q3: 同じブック内の別シートへのリンクを作りたい

Address に空文字 "" を指定し、SubAddress"Sheet2!A1" のようにシート名とセル番地を指定します。例:ws.Hyperlinks.Add Anchor:=ws.Cells(i, 1), Address:="", SubAddress:="Sheet2!A1"

Q4: ネットワークフォルダ(UNCパス)のファイルにもリンクできる?

\\サーバー名\共有名\ファイル.xlsx のようなUNCパスでも動作します。ただしアクセス権限がない場合はクリック時にエラーになります。

Q5: 複数シートに一括でハイパーリンクを設定したい

コードの Set ws = Worksheets("Sheet1") をシートのループに変更すれば対応できます。複数シートの一括処理については /015 も参考にしてください。

まとめ

この記事で、VBAを使ってセルの値からハイパーリンクを一括作成できるようになりました。

  • 基本版Hyperlinks.Add でA列のURLにハイパーリンクを一括設定
  • 応用版:URL・ファイルパス・メールアドレスを自動判定してリンクを設定
  • 実務版:ファイル一覧表のパス列にファイル存在チェック付きで一括リンク設定

ハイパーリンクの一括作成は、一度仕組みを作ってしまえば何度でも使い回せる便利なマクロです。特にファイル管理台帳や連絡先一覧のように「リンクを貼る対象が定期的に増える」シートでは、毎回手作業でリンクを設定する手間がなくなります。基本版でまず動きを確認して、業務に合わせて応用版や実務版にステップアップしていくのがおすすめです。

フォルダ内のファイル一覧を自動取得する方法は /001 で解説しています。特定の文字を含むセルを検索してハイライトする方法は /010 も参考にしてください。

関連記事

もっとカスタマイズしたい場合

「目次シートから各シートへのリンクを自動作成したい」「リンク先のファイルが存在しないセルを赤くしたい」「リンク切れを定期的にチェックしたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • リンクの種類(URL / ファイルパス / メールアドレス / シート内リンク)
  • リンク対象のデータ件数(目安)
  • シートのレイアウト(どの列にリンク先が入っているか)

コメント

タイトルとURLをコピーしました