絶対パスになっている外部参照をチェックまたは置換するマクロです。絶対パスによる参照は、ファイル一式を移動・コピーしてもパスが更新されません。このため、旧版ファイルを参照したままになったり、リンクエラーになったりします。
外部参照で使われている絶対パスを求める関数
ブック中の外部参照のうち、相対パスでなく絶対パスが使われているものを配列化して返す関数です。該当がない場合は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] の形式なので、そのままでは検出されません。ここでは親フォルダーが検出できればよいので、ファイル名を検索対象から外しています。