このブックには、安全ではない可能性のある外部ソースへのリンクが 1 つ以上含まれています。の対処法!

このブックには、安全ではない可能性のある外部ソースへのリンクが 1 つ以上含まれています。の対処法!
集計ブックを開くたびに、見覚えのある警告が出て困っていませんか。

そんなときに困ることは、

・開くたびに「安全ではない可能性のある外部ソースへのリンク」と出る
・「更新する」を押していいのか分からない
・どこにリンクがあるのか、そもそも探し方が分からない

ですね。

この警告は、ブックが別のファイル(外部ブック)を参照しているときに表示されます。

危険なウイルスというわけではありませんが、リンク元のファイルを差し替えられるとデータが書き換わるため、内容を確認せずに更新するのは避けたいところです。

今回はそんなお悩みを解決する、

・この警告が出る原因
・まず何を選べばいいか(更新する/更新しない)
・リンクの場所を確認する方法
・VBAでリンクを一覧にして一括解除する方法
・警告を出さないようにする設定

についてまとめます!

POINT
・この警告はブックが別のファイルを参照している(外部リンクがある)ときに出ます
・心当たりがなければ 「更新しない」 を選んでもデータは消えません
・根本解決は データ タブ → リンクの編集 → リンクの解除
・VBAなら LinkSources で一覧化し、BreakLink で一括解除できます
・解除すると数式が「値」に変わり、元のファイルがなくても表示されます

エラーについて

実際に外部リンク入りのブックを開くと、こちらの警告が表示されます。

安全ではない可能性のある外部ソースへのリンクの警告ダイアログ
上の画像が、問題の警告ダイアログです(実機で撮影しました)。

– 更新する(U) … リンク先のファイルを読みに行って値を更新します
– 更新しない(N) … 保存されている値のまま表示します
– ヘルプ(H) … ヘルプが開きます

この記事では、このリンクを安全に解除して警告を出なくするところまで進めます。

この警告が出る原因

原因はシンプルで、ブックの数式が「別のファイル」を参照していることです。

外部ブックを参照している数式
数式バーを見ると、次のような参照が入っています。

='D:\集計\[参照元_売上実績.xlsx]売上'!C2*B2
参照の書き方 意味 警告
=B2*C2 同じブックのセルを参照 出ない
='[参照元.xlsx]売上’!C2 外部ブックを参照 出る
=’C:\集計\[参照元.xlsx]売上’!C2 パス付きで外部ブックを参照 出る
名前の定義で外部ブックを参照 数式に直接現れないリンク 出る

外部リンクができる主なきっかけ

# きっかけ
1 別のファイルのセルをそのまま参照した(=’ファイル名.xlsx’!A1 の形)
2 別のファイルからコピーして「リンクを貼り付け」した
3 グラフや図のタイトルに別ファイルのセルを指定した
4 自分では気づかないまま、誰かから受け取ったブックに入っていた

> ④が一番厄介で、自分で作った覚えがなくても警告が出ます。まずは「何を参照しているか」を確認するところから始めましょう。

検証用のサンプルデータ(コピペ用)

下の2つの表を、それぞれ別々のブックとして保存すると、外部リンクを再現できます。

1つめは「参照元」のブックです(参照元_売上実績.xlsx として保存)。

商品 数量 単価 金額
ノートPC 8 148000 =B2*C2
マウス 25 3980 =B3*C3
モニター 12 32800 =B4*C4
キーボード 20 6800 =B5*C5
プリンタ 5 45800 =B6*C6

2つめは「リンクを張る側」のブックです(sample_外部リンクあり.xlsx として保存)。

商品 数量 単価 前月比
ノートPC 8 148000 (下の数式を入れる)
マウス 25 3980 (下の数式を入れる)
モニター 12 32800 (下の数式を入れる)
キーボード 20 6800 (下の数式を入れる)
プリンタ 5 45800 (下の数式を入れる)

D2セルに次の数式を入れて、下の行へコピーすると外部リンクが作成されます。

='C:\集計\[参照元_売上実績.xlsx]売上'!C2*B2

※ パスの部分(C:\集計\)は、実際に保存したフォルダに合わせて変更してください。

保存して開き直すと、冒頭の警告ダイアログが表示されます。

STEP1. まず何を選ぶべきか

結論から言うと、心当たりがないときは「更新しない」を選んでください。

選ぶボタン 起きること おすすめの状況
更新する リンク先ファイルを読み込み、値が最新になる 参照元のファイルを自分で管理していて、中身を確認済みのとき
更新しない 保存済みの値のまま表示(データは消えません) 心当たりがない/受け取ったブックのとき
POINT
・「更新しない」を選んでも値が消えるわけではありません(前回保存した値が残ります)
・リンク先のファイルが既に移動・削除されていると、更新してもエラーになるだけです
・迷ったら「更新しない」で開いて、中身を確認してから解除するのが安全です

STEP2. どこにリンクがあるか確認する

マウス操作で確認する場合は、次の手順です。

1. データ タブをクリックする
2. クエリと接続グループのリンクの編集をクリックする
3. 一覧にリンク先のファイル名が表示される
4. リンクの解除を押すと、そのリンクを外せる

「リンクの編集」がグレーで押せない場合は、そのブックに外部リンクが無い(=警告の原因が別にある)ということです。

その場合は、名前の定義にリンクが残っている可能性があります。

STEP3. VBAでリンクを一覧にする

リンクが複数あると、1つずつ確認するのは手間です。

そこで、VBAでリンク先を一覧にしてしまうのがおすすめです。

Sub 外部リンクを一覧にする()
    Dim links As Variant, i As Long

    links = ThisWorkbook.LinkSources(xlExcelLinks)

    If IsEmpty(links) Then
        MsgBox "このブックに外部リンクはありません"
        Exit Sub
    End If

    Range("A1:D1").Value = ("No", "リンク先ファイル", "種類", "状態")
    For i = LBound(links) To UBound(links)
        Cells(i + 1, 1).Value = i
        Cells(i + 1, 2).Value = links(i)
        Cells(i + 1, 3).Value = "Excel ブック"
        Cells(i + 1, 4).Value = "リンクあり"
    Next i
    Columns("B:B").ColumnWidth = 52

    MsgBox UBound(links) - LBound(links) + 1 & "件の外部リンクがあります"
End Sub

実行すると、このようにリンク先が一覧になります。

VBAで一覧化した外部リンク
命令 役割
ThisWorkbook.LinkSources(xlExcelLinks) 外部リンクのパスを配列で返す(無ければ Empty)
IsEmpty(links) リンクが無いときの判定。ここを忘れるとエラーになります
LBound / UBound 配列の最初と最後の番号。ループで使います
xlExcelLinks Excelブックへのリンク(定数=1)。DDE/OLEのリンクと区別します

「一覧にした結果、身に覚えのないファイルが入っていた」というときは、更新せずに解除するのが安全ですね。

STEP4. VBAでリンクを一括解除する

一覧で確認できたら、そのまま一括で解除できます。

Sub 外部リンクを一括解除する()
    Dim links As Variant, i As Long

    links = ThisWorkbook.LinkSources(xlExcelLinks)
    If IsEmpty(links) Then
        MsgBox "解除するリンクはありません"
        Exit Sub
    End If

    For i = LBound(links) To UBound(links)
        ThisWorkbook.BreakLink Name:=links(i), Type:=xlLinkTypeExcelLinks
    Next i

    MsgBox "外部リンクを解除しました(値はそのまま残ります)"
End Sub

実行結果がこちらです。

リンク解除の実行結果

解除後に残った外部リンクは0件になりました。

ポイント 内容
値は残る 解除してもセルの表示は変わりません(数式が値に置き換わるだけ)
元ファイル不要 以後は参照元のファイルがなくてもそのまま表示できます
戻せない 解除するとリンクには戻せません。必要なら先にブックをコピーしておきましょう
名前の定義は別 名前の定義に残ったリンクは手で削除が必要です(後述)
POINT
・BreakLink は「数式 → 値」に置き換える命令です(データは消えません)
・Name:= には一覧で得たパスをそのまま渡します
・Type:=xlLinkTypeExcelLinks(=1)を忘れるとエラーになります
・解除の前にブックのコピーを取っておくと安心です

STEP5. 解除できたか確認する

解除後に数式バーを見ると、数式が「値」に変わっているのが分かります。

解除後に数式が値に変わった状態

画像の数式バーには 1184000 とだけ表示されています。

解除前は =’D:\集計\[参照元_売上実績.xlsx]売上’!C2*B2 という数式だったのが、値そのものに置き換わりました。

これで参照元のファイルを移動しても削除しても、このブックは壊れません。

外部リンクを解除した完成状態

STEP6. 警告を出さないようにする(設定)

「解除はしたくないけれど、警告は止めたい」という場合は、Excelの設定で止められます。

1. ファイル タブ → オプションをクリックする
2. セキュリティ センター → セキュリティ センターの設定をクリックする
3. 外部コンテンツの設定を選ぶ
4. ブックへのリンクの更新で「セキュリティ上の危険があるため、ブックへのリンクの更新を無効にする」を選ぶ
5. OK で閉じる
方法 効果 おすすめ度
リンクを解除する(STEP4) 根本解決。警告も出ない ★★★★★
設定で更新を無効にする 警告は出るが自動更新されない ★★★
「信頼済みの場所」に置く そのフォルダのブックは警告が出ない ★★★
毎回「更新しない」を押す その場はしのげるが毎回聞かれる ★

設定で止めるのは対症療法で、根本解決にはなりません。
リンクを外してしまえば毎回の確認も出なくなるのでカンタンですね。

リンク自体が不要なら、STEP4の解除までやってしまうのが一番すっきりします。

うまくいかないときの対処法(トラブルシュート)

実際に試すと、思ったようにいかないこともあるかもしれません。

よくあるつまずきと対処法をまとめました。

症状 原因 対処
「リンクの編集」がグレーで押せない 外部リンクが無い/名前の定義に残っている 数式タブ → 名前の管理で外部参照を探して削除する
解除したのに警告がまた出る 解除されていないリンクが別に残っている LinkSources で一覧にして残りを確認する
解除すると#REF! になる 参照元が既に無く、値も保存されていない そのセルは手で入れ直す(解除前に値をコピーしておく)
グラフや図形のリンクが消えない 解除できるのはセル/名前のリンクのみ グラフのタイトル等を手動で文字に置き換える
実行時エラーが出る Type(xlLinkTypeExcelLinks)の指定漏れ Type:=xlLinkTypeExcelLinks を付ける
解除後に値が消えた リンク先が既に存在せず、#REF! を値にした バックアップから復元し、先に「更新しない」で開いて値を確認する
マクロがブロックされる 信頼されていない場所のファイル 「信頼済みの場所」にフォルダを追加する

よくある間違い

間違い 起きること 正しい対処
警告を読まずに「更新する」を押す 外部の値でデータが書き換わる 心当たりがなければ「更新しない」
リンクを残したまま配布する 受け取った人にも毎回警告が出る 配布前にリンクを解除する
「更新しない」でデータが消えると思っている 実は値はそのまま残る 安心して「更新しない」を選んでよい
解除の前に上書き保存する 戻せなくなる 先にブックのコピーを取る(SaveCopyAs が便利)
リンクの解除=危険な操作だと思っている 作業が進まない 解除は数式→値の置き換え。データは残ります

エク短流:リンクの確認と解除をまとめて実行する

実務では「一覧で確認 → 問題なければ解除」を1回で済ませたいところです。

次のコードは、リンクを一覧に書き出し、確認メッセージで「はい」を選んだときだけ解除する例です。

Sub リンクを確認して解除する()
    Dim links As Variant, i As Long, msg As String
    Dim bk As Workbook
    Set bk = ThisWorkbook

    links = bk.LinkSources(xlExcelLinks)
    If IsEmpty(links) Then
        MsgBox "このブックに外部リンクはありません"
        Exit Sub
    End If

    ' ① 先に控えを取っておく(解除は戻せないため)
    bk.SaveCopyAs bk.Path & "\" & _
        Left(bk.Name, InStrRev(bk.Name, ".") - 1) & "_リンク解除前.xlsm"

    ' ② 一覧をシートに書き出す
    Range("A1:C1").Value = ("No", "リンク先ファイル", "状態")
    For i = LBound(links) To UBound(links)
        Cells(i + 1, 1).Value = i
        Cells(i + 1, 2).Value = links(i)
        Cells(i + 1, 3).Value = "リンクあり"
        msg = msg & i & ". " & links(i) & vbCrLf
    Next i
    Columns("B:B").ColumnWidth = 52

    ' ③ 確認してから解除する
    If MsgBox("次の外部リンクを解除しますか?" & vbCrLf & vbCrLf & msg, _
              vbYesNo + vbQuestion) <> vbYes Then
        MsgBox "解除を中止しました(一覧だけ残しています)"
        Exit Sub
    End If

    For i = LBound(links) To UBound(links)
        bk.BreakLink Name:=links(i), Type:=xlLinkTypeExcelLinks
    Next i

    MsgBox "解除しました。値はそのまま残っています"
End Sub

① 先に控えを取る → ② 一覧を出す → ③ 確認してから解除 の順にすると、万一のときも安心です。

解除は戻せない操作なので、この流れをボタンに割り当てておくと運用がラクになりますね。

タカヒロ

タカヒロ
この警告は、ウイルスではなく「別のファイルを見ていますよ」というお知らせです。
慌てずに「更新しない」で開いて、リンクを解除してから保存する。この順番だけ覚えておけば大丈夫ですよ。

さいごに

今回は、Excelで「安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています」と表示されたときの対処法をまとめました。

1. この警告はブックが外部のファイルを参照しているときに出る
2. 心当たりがなければ 「更新しない」 を選ぶ(データは消えません)
3. 確認は データ → リンクの編集
4. VBAなら LinkSources で一覧、BreakLink で一括解除
5. 解除すると数式が値に変わり、参照元がなくても表示できる

警告は「危険だから必ず消す」ものではなく、リンクが必要かどうかを判断する合図です。

不要なリンクは解除して、配布先でも警告が出ないブックにしておきたいですね。

リンクを解除してスッキリさせたいときは、この手順をぜひ試してみてください。

最後までお読みいただきありがとうございました。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。






コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA ImageChange Image