絶対パスの外部参照をチェックする/置換する

絶対パスになっている外部参照をチェックまたは置換するマクロです。絶対パスによる参照は、ファイル一式を移動・コピーしてもパスが更新されません。このため、旧版ファイルを参照したままになったり、リンクエラーになったりします。

外部参照で使われている絶対パスを求める関数

ブック中の外部参照のうち、相対パスでなく絶対パスが使われているものを配列化して返す関数です。該当がない場合はEmpty が返ります。

Function f_GetArray_FullPathLink() as Variant

  Dim aryLinkAll As Variant
  Dim aryLinkChk As Variant
  Dim sPath As String
  Dim cnt As Long, i As Long

  '外部参照パスの配列
  aryLinkAll = ActiveWorkbook.LinkSources(xlExcelLinks)
  If IsEmpty(aryLinkAll) Then Exit Function

  '相対パス化できるものを除く
  ReDim aryLinkChk(1 To UBound(aryLinkAll))
  sPath = ActiveWorkbook.Path
  For i = 1 To UBound(aryLinkAll)
    If InStr(aryLinkAll(i), sPath) = 0 Then
      cnt = cnt + 1
      aryLinkChk(cnt) = aryLinkAll(i)
    End If
  Next i

  If cnt = 0 Then Exit Function
  ReDim Preserve aryLinkChk(1 To cnt)
  f_GetArray_FullPathLink = aryLinkChk
End Function
Workbook.LinkSources(xlExcelLinks)

LinkSources(xlExcelLinks) は、ブックに含まれる外部参照の一式を取得するメソッドです。ここで取得できるのは各参照のフルパステキストの配列で、[データ]タブの[リンクの編集]から表示される[リンクの編集]ダイアログボックスの表示内容と同等のものです。次の特徴があります。

各参照が使われているシートやセル位置などの情報は取得できません

参照として機能しているパスは対象になります。例えば、数式内にパスのテキストがなくINDIRECT関数で合成されているものも対象になります

絶対パスを選別

参照先パス中にブックの場所が含まれないものが絶対パスということなので、InStr(参照先のパス, ブックの場所) = 0 で選別しています。

外部参照の絶対パスを書き換える例

特定のパスを置換で書き換えるマクロです。例えば、[Ver1]フォルダーをコピーして [Ver2]フォルダーを作成した場合に、[Ver1]フォルダー内のファイルを参照したままになっているパスを書き換えます。

Sub 外部参照の絶対パスを置換()

  Const pathOld As String = "[Ver1]"
  Const pathNew As String = "[Ver2]"
  Dim aryPath As Variant
  Dim pathBuf As String
  Dim i As Long

  'ブック中の絶対パスによる外部参照のリスト配列
  aryPath = f_GetArray_FullPathLink
  If IsEmpty(aryPath) Then Exit Sub

  '参照パスの置換
  For i = 1 To UBound(aryPath)
    pathBuf = Replace(aryPath(i), pathOld, pathNew)
    If aryPath(i) <> pathBuf Then
      ActiveWorkbook.ChangeLink _
        aryPath(i), pathBuf, xlExcelLinks
    End If
  Next i
End Sub
Workbook.ChangeLink 元パス, 新パス, xlExcelLinks

参照先のパスを書き換えるメソッドです。[リンクの編集]ダイアログボックスの[リンク元の変更]ボタンを操作した場合と同等です。

ここでは、Replace で [Ver1] を [Ver2] に置換し、置換前後で変化があったものを書き換えています。

外部参照の絶対パスを検索してマーキングする例

Replaceメソッドを使って、外部参照の絶対パスを検索して該当セル文字色を変えるマクロです。

Sub 外部参照の絶対パスを検索()

  Dim aryPath As Variant
  Dim rngFml As Range
  Dim rngFnd As Range
  Dim i As Long

  'ブック中の絶対パスによる外部参照のリスト配列
  aryPath = f_GetArray_FullPathLink
  If IsEmpty(aryPath) Then Exit Sub

  'フォルダーパスを抜き出し
  For i = 1 To UBound(aryPath)
    aryPath(i) = Left(aryPath(i), InStrRev(aryPath(i), "\"))
  Next i

  '絶対パスを持つ数式を検索して赤文字に
  Set rngFml = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23)
  With Application.ReplaceFormat
    .Clear
    .Font.Color = RGB(255, 0, 0)
  End With
  For i = 1 To cnt
    rngFml.Cells.Replace _
      What:=aryPath(i), _
      Replacement:="", _
      LookAt:=xlPart, _
      MatchCase:=False, _
      SearchFormat:=False, _
      ReplaceFormat:=True
  Next i
End Sub
フォルダーパスを抜き出し

Left(aryPath(i), InStrRev(aryPath(i), "\")) で、ファイル名部分を除いています。aryPathのパスは通常の形式ですが、数式内のパスは [ファイル名.xlsx] の形式なので、そのままでは検出されません。ここでは親フォルダーが検出できればよいので、ファイル名を検索対象から外しています。

数式内のパスを検索するので、実行時に参照先のブックを開いていないことが前提となります。
Replace メソッドについては、以下のトピックを参照してください。
タイトルとURLをコピーしました