Excelだファイルの各シートで別シートを参照している場合、その参照関係を一覧化するマクロです。
Sub AnalyzeSheetReferences()
Dim wb As Workbook
Dim ws As Worksheet
Dim resultWs As Worksheet
Dim filePath As String
Dim targetWb As Workbook
Dim sheetNames As Collection
Dim i As Integer, j As Integer
Dim currentSheet As Worksheet
Dim searchSheet As Worksheet
Dim cell As Range
Dim searchString As String
Dim resultRow As Integer
Dim found As Boolean
' エラーハンドリング
On Error GoTo ErrorHandler
' 現在のワークブックを取得
Set wb = ThisWorkbook
' メインシートのC2セルからファイルパスを取得
filePath = wb.Sheets("メイン").Range("C2").Value
' ファイルパスが空の場合はエラー
If filePath = "" Then
MsgBox "C2セルにファイルパスが入力されていません。"
Exit Sub
End If
' ファイルが存在するかチェック
If Dir(filePath) = "" Then
MsgBox "指定されたファイルが存在しません: " & filePath
Exit Sub
End If
' 対象のExcelファイルを開く
Set targetWb = Workbooks.Open(filePath)
' 解析結果シートが既に存在する場合は削除
For Each ws In wb.Worksheets
If ws.Name = "解析結果" Then
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
Exit For
End If
Next ws
' 解析結果シートを作成
Set resultWs = wb.Worksheets.Add
resultWs.Name = "解析結果"
' ヘッダーを設定
resultWs.Range("A1").Value = "ワークブック名"
resultWs.Range("B1").Value = "現在のシート名"
resultWs.Range("C1").Value = "参照先シート名"
' 結果出力の開始行
resultRow = 2
' 全シートのシート名リストを作成
Set sheetNames = New Collection
For Each ws In targetWb.Worksheets
sheetNames.Add ws.Name
Next ws
' 全シートをループ
For Each currentSheet In targetWb.Worksheets
' シート名リストをループ
For i = 1 To sheetNames.Count
searchString = sheetNames(i) & "!"
found = False
' 現在のシートで検索文字列を検索
For Each cell In currentSheet.UsedRange
If cell.HasFormula Then
' 数式内で検索
If InStr(cell.Formula, searchString) > 0 Then
found = True
Exit For
End If
ElseIf Not IsEmpty(cell.Value) Then
' セル値内で検索
If InStr(CStr(cell.Value), searchString) > 0 Then
found = True
Exit For
End If
End If
Next cell
' ヒットした場合は結果を出力
If found Then
resultWs.Cells(resultRow, 1).Value = targetWb.Name
resultWs.Cells(resultRow, 2).Value = currentSheet.Name
resultWs.Cells(resultRow, 3).Value = sheetNames(i)
resultRow = resultRow + 1
End If
Next i
Next currentSheet
' 対象のExcelファイルを閉じる
targetWb.Close SaveChanges:=False
' 結果シートを選択
resultWs.Select
' 列幅を自動調整
resultWs.Columns("A:C").AutoFit
MsgBox "解析が完了しました。結果は「解析結果」シートに出力されました。"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
' 開いたファイルがある場合は閉じる
If Not targetWb Is Nothing Then
targetWb.Close SaveChanges:=False
End If
End Sub