Excelの「名前」は、セル範囲、定数、数式に分かりやすい識別子を付ける機能です。数式を読みやすくできる一方、シートのコピーや外部ブックからの貼り付けで重複・非表示・参照切れの名前が増えると、削除できない、名前が競合するといった問題につながります。
本記事では、旧記事に分かれていた名前の作成・取得・存在確認・削除を一つにまとめます。
検証日:2026年9月11日
対象:Microsoft 365版Excel、Excel 2024(Windows)。VBAコードは実行前にブックのバックアップを作成してください。
たとえば =SUM(C2:C100) を =SUM(SalesAmount) と書けば、参照の意味が分かりやすくなります。名前はセル範囲だけでなく、定数や数式にも設定できます。
作成方法は次の通りです。
名前には「ブック」と「ワークシート」のスコープがあります。同じ文字列でもスコープが違えば別の名前として存在できるため、VBA処理ではここを意識します。
「数式」→「名前の管理」を開くと、名前、値、参照範囲、スコープを一覧できます。まず「エラーのある名前」で絞り込み、#REF! を含む参照切れを確認します。
削除前に、その名前が数式、グラフ、入力規則、印刷範囲などで使われていないか確認してください。名前を削除しても、参照していた数式が自動修復されるわけではありません。
Option Explicit
Sub ListWorkbookNames()
Dim nm As Name
For Each nm In ThisWorkbook.Names
Debug.Print nm.Name, nm.RefersTo, nm.Visible
Next nm
End Sub
VBEのイミディエイトウィンドウに、ブックで認識されている名前が出力されます。Visible=False の名前は「名前の管理」に表示されない場合があるため、問題調査ではVBAの一覧も確認します。
エラー処理を処理全体へ広げず、名前取得部分だけに限定します。
Private Function NameExists(ByVal nameText As String) As Boolean
Dim nm As Name
On Error Resume Next
Set nm = ThisWorkbook.Names(nameText)
On Error GoTo 0
NameExists = Not nm Is Nothing
End Function
Sub CheckName()
If NameExists("SalesAmount") Then
MsgBox "SalesAmount は存在します。"
Else
MsgBox "SalesAmount は存在しません。"
End If
End Sub
On Error Resume Next を解除し忘れると別の不具合まで見逃すため、直後に On Error GoTo 0 を置きます。
Sub AddNameIfMissing()
Const TARGET_NAME As String = "SalesAmount"
If Not NameExists(TARGET_NAME) Then
ThisWorkbook.Names.Add _
Name:=TARGET_NAME, _
RefersTo:="=Sheet1!$C$2:$C$100", _
Visible:=True
End If
End Sub
実行後、「名前の管理」に SalesAmount が1件だけ表示され、参照範囲が Sheet1!$C$2:$C$100 になっていることを確認します。
#REF! の名前だけを削除する一覧を削除しながら列挙すると取りこぼすことがあるため、末尾から処理します。
Sub DeleteBrokenNames()
Dim i As Long
Dim deletedCount As Long
Dim answer As VbMsgBoxResult
answer = MsgBox( _
"参照に #REF! を含む名前を削除します。バックアップ済みですか?", _
vbYesNo + vbExclamation)
If answer <> vbYes Then Exit Sub
For i = ThisWorkbook.Names.Count To 1 Step -1
If InStr(1, ThisWorkbook.Names(i).RefersTo, "#REF!", vbTextCompare) > 0 Then
Debug.Print "Delete: " & ThisWorkbook.Names(i).Name
ThisWorkbook.Names(i).Delete
deletedCount = deletedCount + 1
End If
Next i
MsgBox deletedCount & " 件削除しました。"
End Sub
このコードは参照切れだけを対象にします。「すべての名前を一括削除」は印刷範囲や業務数式まで壊す危険があるため推奨しません。
Visible=False の非表示名をVBAで確認する.xlsx のコピーを作り、問題が再現する最小構成で試すシートローカル名は内部的に Sheet1!LocalName のように識別されます。ブック名と同じ文字列がある場合、意図したスコープの名前を操作しているかを必ず確認してください。