外部リンクの見つけ方と削除

中級VBA

はじめに

「このブックには、安全でない可能性のある外部ソースへのリンクが1つ以上含まれています。」といううエラーが発生した場合、ブック内に他のブックを参照するリンクが紛れ込んでいる可能性があります。

 リンクの解除方法については以下を参照してみてください。
 ・「このブックには、安全でない可能性のある外部ソースへのリンクが1つ以上含まれています」

 ここでは、VBAによる外部リンクの探し方とリンクの削除方法について紹介します。

外部リンクの探し方

 ブック内の外部リンクを見つけるには、数式マクロ内に [ ] 記号が含まれているのを探します。
外部リンクは、以下のような書式になっていますので、これを利用します。

 =[売上0721.xlsx]Sheet1!$A$1  (ブックが開いていない場合はフルパスが付く)

 この時、セルの値(Value)ではなく、数式(Formula)を指定して文字列検索します。

'外部リンクを見つける
Sub mySearchLink()
    Dim i As Long
    Dim sh
    Dim c
    For i = 1 To Worksheets.Count
        For Each c In Worksheets(i).UsedRange
            If InStr(c.Formula, "[") > 0 Then
                Debug.Print Worksheets(i).Name & " " & c.Address
            End If
        Next c
    Next i
End Sub

 このプログラムでは、ブック内のシートで記述のある部分に対して、外部リンクの含まれるセルを Debug.Print でイミディエイトウィンドウに表示します。

外部リンクの削除

 外部リンクを削除するには、まずブックオブジェクトの LinkSources を使って外部リンクを取得します。LinkSources の引数は、リンクのタイプを指定します。ここでは、xlExcelLinks (Excel ワークシートへのリンク)を指定しています。
 外部リンクがあると、arr に配列として代入されるので、これに対して外部リンクの削除を行っていきます。

 ブックオブジェクトの BreakLink は、他のExcelブック、OELソースのリンクを 値に変換してくれます。引数には、リンク名(Name)と リンクタイプ(Type)を指定します。

'外部リンクを削除する
Sub myBrakeLinkSources()
    Dim i As Long
    Dim arr

    arr = ActiveWorkbook.LinkSources(xlExcelLinks)
    
    If IsEmpty(arr) Then
        MsgBox "外部リンクは見つかりませんでした。"
    End If

    For i = 1 To UBound(arr)
        Debug.Print arr(i)
        ActiveWorkbook.BreakLink Name:=arr(i), Type:=xlLinkTypeExcelLinks
    Next i
    
End Sub

 尚、LinkSources で得られる値は、リンク先のパスで、複数のセルでもリンク先のパスが同じなら1つになります。セルのアドレスを示していませんので、場所を特定する事はできません。

外部リンクと値を削除する

 外部リンクと、その値を削除するには、[外部リンクの探し方]で使ったコードで外部リンクのあるセルを見つけて値を削除すれば良いでしょう。

'外部リンクのあるセルの値を削除
Sub myLinkCellsClear()
    Dim i As Long
    Dim sh
    Dim c
    For i = 1 To Worksheets.Count
        For Each c In Worksheets(i).UsedRange
            If InStr(c.Formula, "[") > 0 Then
                'Debug.Print Worksheets(i).Name & " " & c.Address
                c.ClearContents
            End If
        Next c
    Next i
End Sub
タイトルとURLをコピーしました