Excelの「名前」は、セル範囲、定数、数式に分かりやすい識別子を付ける機能です。数式を読みやすくできる一方、シートのコピーや外部ブックからの貼り付けで重複・非表示・参照切れの名前が増えると、削除できない、名前が競合するといった問題につながります。

本記事では、旧記事に分かれていた名前の作成・取得・存在確認・削除を一つにまとめます。

検証日:2026年9月11日

対象:Microsoft 365版Excel、Excel 2024(Windows)。VBAコードは実行前にブックのバックアップを作成してください。

名前を使うメリット

たとえば =SUM(C2:C100)=SUM(SalesAmount) と書けば、参照の意味が分かりやすくなります。名前はセル範囲だけでなく、定数や数式にも設定できます。

作成方法は次の通りです。

  1. 対象セルを選択する
  2. 「数式」タブの「名前の定義」を選ぶ
  3. 名前、範囲、参照範囲を確認する

名前には「ブック」と「ワークシート」のスコープがあります。同じ文字列でもスコープが違えば別の名前として存在できるため、VBA処理ではここを意識します。

名前の管理で確認する

「数式」→「名前の管理」を開くと、名前、値、参照範囲、スコープを一覧できます。まず「エラーのある名前」で絞り込み、#REF! を含む参照切れを確認します。

削除前に、その名前が数式、グラフ、入力規則、印刷範囲などで使われていないか確認してください。名前を削除しても、参照していた数式が自動修復されるわけではありません。

VBAで名前を一覧取得する

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 のように識別されます。ブック名と同じ文字列がある場合、意図したスコープの名前を操作しているかを必ず確認してください。

公式資料

Previous Post Next Post