Excelでシートをコピーすると「名前は既に存在します」と出る原因と消し方|非表示の名前も削除

スポンサーリンク

月次ブックのシートを別のブックへコピーしようとしたら、「○○という名前は既に存在します」という趣旨の確認が出てきた。しかも「はい」を押しても、次から次へと同じダイアログが続く。Excelでシートをコピー・移動するたびにこうなると、作業がまったく進みません。

厄介なのは、名前の定義を自分で作った覚えがないケースです。「名前の管理」を開いても、ダイアログに出てきた名前が一覧に見当たらないこともあります。

とりあえず押して閉じると、今度は数式がエラーになるかもしれない。不安になりますよね。

この記事では、ダイアログの各ボタンを押すと何が起きるかを最初に整理します。そのうえで原因を4つに分け、名前の管理のどこを見れば判別できるかを表にしました。一覧に出ない非表示の名前を、コピペで使えるVBAで「一覧表示→確認→削除」する手順まで紹介します。

対応バージョン: Microsoft 365 / Excel 2021 / 2019 / 2016 のデスクトップ版(Windows)が主な対象です。「すべてはい」ボタンは、公式ヘルプではサブスクリプション版(Microsoft 365)のみ表示とされています。名前の管理とVBAは Excel for the web では使えないため、デスクトップ版で開いて操作してください。

Excelでシートをコピーすると「名前は既に存在します」と出る理由と、ボタンを押した結果

このダイアログは、公式ヘルプでは「名前の競合」ダイアログと呼ばれています。コピー元とコピー先のブックに同じ名前(名前付き範囲)があるとき、どちらを使うかを確認するために出るものです。

ダイアログの中身と、何度も出る理由

公式ヘルプの例では、「『金利』という名前はすでに存在します」に続けて、ボタンごとの意味が説明される形でした。そのバージョンの名前を使うなら「はい」、コピーする側の名前を変えるなら「いいえ」、という趣旨です。実際の文言はバージョンによって異なる可能性があるので、言い回しが完全に一致しなくても気にしなくて大丈夫。

何度も出るのは、競合する名前1つにつき1回ずつ確認されるからです。競合する名前が10個あれば、10回続けて聞かれることになります。最初に出た名前は原因を探す手がかりになるので、メモしておきましょう。

「はい」「すべてはい」「いいえ」を押した結果

ボタンを押した後に何が起きるかを、公式ヘルプの説明をもとにまとめました。

ボタン押した後に起きること注意点
はい競合している名前がコピー先にコピーされる似た名前が2つ存在する状態になり、その名前を使う数式がエラーになるおそれがある
すべてはい競合するすべての名前をまとめてコピーする。以降の競合ダイアログは出ないサブスクリプション版(Microsoft 365)のみ表示
いいえ名前を変更するためのダイアログが開く新しい名前を入力して「OK」を押す。入力できない名前のルールがある

「すべてはい」は手早いものの、似た名前が2つずつ残る状態をまとめて作ることになります。ボタンを押した後にスコープ(有効範囲)がどう分かれるかまでは公式に記載がありません。押した後は、名前の管理で中身を確認しておきましょう。

迷ったら「いいえ」で名前を変更する

公式ヘルプでも、データの中身に詳しくない場合は「いいえ」を選び、名前を1つずつ変えるよう勧めています。名前を変えておけば、同じ名前が2つ並ぶ状態を避けられるからです。

新しい名前には次のようなルールがあるので、入力するときに気をつけてください。

  • 先頭は文字かアンダースコア(_)にする
  • 「A1」「XFD21」のようなセル番地と同じ形は使えない
  • スペースや「 / * [ ] : ?」は使えない
  • コピー先ブックにある別の名前と同じにはできない

ただし、これはダイアログをその場でしのぐ方法にすぎません。毎回出るのを止めたいなら、次の章で原因の名前を突き止めて消すのが近道です。

原因を見分ける|名前の管理のどこを見るか

まずは「数式」タブの「定義された名前」グループから「名前の管理」を開きます(ショートカットは Ctrl+F3)。ダイアログに出た名前を一覧で探し、「参照範囲」と「範囲」(スコープ)の列を見比べてください。名前の作り方やスコープの基本は、Excelの「名前の定義」の使い方で詳しく解説しています。

原因名前の管理で見る場所見え方の例主な対処
1. シート単位とブック単位の同名「範囲」列同じ名前が「ブック」と「東京」のように2行ある不要な方を削除するか名前を変える
2. 参照先が #REF! の壊れた名前「参照範囲」列「=#REF!」や「=#REF!$A$2:$A$20」名前の管理で削除
3. 他ブック由来の名前「参照範囲」列「='[旧_月次.xlsx]マスタ’!$A$1:$C$50」不要なら削除。外部リンクも整理
4. 一覧に出ない非表示の名前一覧そのものダイアログに出た名前が一覧に無いVBAで一覧表示して削除

原因1 シート単位とブック単位の同名

名前には、ブック全体で使えるものと、特定のシートの中だけで使えるものがあります。同じ「売上合計」でも、ブック単位とシート単位で別々に作れてしまうのです。

この状態のシートを別ブックへ移すと、コピー先の名前とぶつかることがあります。月次ブックを毎月コピーして作っていると、同じ名前が少しずつ増えていくこともあるでしょう。

原因2 参照先が #REF! の壊れた名前

名前が指していた行・列やシートを削除すると、参照範囲が「#REF!」に変わります。名前そのものは残るため、使われないまま一覧に溜まっていくわけです。

こうした壊れた名前もシートと一緒にコピーされ、競合のダイアログに出てきます。#REF! が出るしくみは、Excelの#REF!エラーの原因と直し方も参考にしてみてください。

原因3 他ブック由来の名前

参照範囲に「[ファイル名.xlsx]」のような角括弧付きのファイル名が入っていたら、他ブックを参照する名前です。別ブックとの間でシートをコピーすると、元のブックを指す名前が一緒についてくることがあります。

この種の名前は、ブックを開くたびに出る「リンクの更新」の原因にもなります。外部リンクを解除する手順は、Excelで外部リンクの更新が毎回出る原因と解消法にまとめてあります。

原因4 一覧に出ない非表示の名前

ダイアログに出た名前が名前の管理に見当たらないなら、非表示の名前を疑ってください。名前には「表示・非表示」の設定(VBAの Visible プロパティ)があります。公式ヘルプによると、非表示にされた名前やVBAで定義された名前は名前の管理に表示されません。

古いテンプレートやアドインが作った名前が、非表示のまま残っていることがあります。画面からは削除できないため、後半のVBAで探し出します。

名前の管理で不要な名前をまとめて削除する

原因1〜3の名前は、名前の管理の画面から削除できます。作業の前に、もしものときに戻れる準備をしておきましょう。

削除前にブックを別名保存する

名前の削除は「元に戻す」(Ctrl+Z)で戻せない場合があります。「ファイル」→「名前を付けて保存」で、日付入りの別名ファイルを1つ作っておくと安心です。万一おかしくなっても、そのファイルから作業をやり直せます。

「エラーのある名前」で #REF! の名前を絞り込む

名前の管理の右上にある「フィルター」には、次の6つの項目があります。

フィルターの項目表示される名前
ワークシート内にある名前シート単位の名前
ブック内にある名前ブック単位の名前
エラーのある名前#REF! や #VALUE!、#NAME? などを含む名前
エラーのない名前エラーを含まない名前
定義された名前ユーザーや Excel が定義した名前(印刷範囲など)
テーブル名テーブルの名前

壊れた名前を消すなら、「エラーのある名前」を選ぶのが早道です。手順は次の4ステップ。

  1. Ctrl+F3 で名前の管理を開く
  2. 「フィルター」から「エラーのある名前」を選ぶ
  3. 先頭の名前をクリックし、Shift キーを押しながら最後の名前をクリックする
  4. 「削除」を押し、確認で「OK」を押す

離れた名前だけを選びたいときは、Ctrl キーを押しながらクリックします。原因1の同名を整理するなら、「ワークシート内にある名前」と「ブック内にある名前」を切り替えてみましょう。並べて見比べると、どちらが不要か判断しやすくなります。

削除すると数式が #NAME? になる注意

削除した名前を使っている数式があると、その数式は #NAME? エラーになる場合があります。#REF! の名前は参照先がすでに無いので、使われていても結果はもともとエラーです。

一方で、正常な名前を消すときは注意が必要です。使っているセルは、Ctrl+F の「検索と置換」で確かめられます。「オプション」から「検索対象」を「数式」にして、名前で検索してください。

一覧に出ない非表示の名前を見つけて消す(コピペVBA)

非表示の名前は、VBAを使えば一覧に出して削除できます。ここでは「マクロ1で全件を一覧表示」→「確認」→「マクロ2で #REF! の名前だけ削除」という流れで進めます。

NOTE

VBAの入れ方: Alt+F11 でVBE(Visual Basic Editor)を開き、「挿入」→「標準モジュール」を選んでコードを貼り付けます。実行は、コードの中にカーソルを置いて F5 キーです。マクロを残したまま保存する場合は「Excelマクロ有効ブック(.xlsm)」を選んでください。実行前に、必ずブックを別名保存しておきましょう。

マクロ1 非表示の名前を含めて全件を一覧表示する

開いているブックの末尾に新しいシートを追加し、すべての名前を書き出すマクロです。名前の変更や削除はしないので、まずはこちらで中身を確認しましょう。

Sub ListAllNames()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim n As Name
    Dim r As Long
    Dim ref As String

    Set wb = ActiveWorkbook
    Set ws = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))

    ws.Range("A1:E1").Value = Array("名前", "スコープ", "参照範囲", "表示", "#REF!を含む")
    r = 2

    For Each n In wb.Names
        ref = ""
        On Error Resume Next
        ref = n.RefersTo
        On Error GoTo 0

        ws.Cells(r, 1).Value = "'" & n.Name
        If TypeName(n.Parent) = "Worksheet" Then
            ws.Cells(r, 2).Value = n.Parent.Name
        Else
            ws.Cells(r, 2).Value = "ブック"
        End If
        ws.Cells(r, 3).Value = "'" & ref
        ws.Cells(r, 4).Value = IIf(n.Visible, "表示", "非表示")
        If InStr(ref, "#REF!") > 0 Then ws.Cells(r, 5).Value = "はい"
        r = r + 1
    Next n

    ws.Columns("A:E").AutoFit
    MsgBox "名前は " & (r - 2) & " 件です。", vbInformation
End Sub

参照範囲の先頭に「’」を付けているのは、書き出した文字列が数式として計算されないようにするためです。実行すると、たとえば次のような一覧ができます。

名前スコープ参照範囲表示#REF!を含む
売上合計ブック=集計!$B$2:$B$13表示 
東京!売上合計東京=東京!$B$2:$B$31表示 
担当者ブック=#REF!$A$2:$A$20非表示はい
単価表ブック='[旧_月次.xlsx]マスタ’!$A$1:$C$50非表示 
部署ブック=#REF!表示はい
東京!Print_Area東京=東京!$A$1:$F$40表示 

この例のメッセージは「名前は 6 件です。」となります。2つの「売上合計」が原因1の同名、「担当者」と「部署」が原因2の壊れた名前です。「単価表」は他ブック由来で、「担当者」と「単価表」の2件が非表示の名前にあたります。

注目したいのは「担当者」。#REF! の名前ですが非表示なので、名前の管理で「エラーのある名前」に絞っても出てきません。画面から消せるのは「部署」だけということです。

確認が済んだら、追加した一覧のシートは削除してOK。

マクロ2 参照先が #REF! の名前だけ削除する

参照範囲に #REF! を含む名前を、非表示のものも含めて削除するマクロです。印刷範囲(Print_Area)などExcelが使う名前と、テーブル名は対象から外しています。

Sub DeleteRefErrorNames()
    Dim wb As Workbook
    Dim n As Name
    Dim i As Long
    Dim cnt As Long
    Dim msg As String

    Set wb = ActiveWorkbook

    For i = wb.Names.Count To 1 Step -1
        Set n = wb.Names(i)
        If IsDeleteTarget(wb, n) Then
            msg = msg & n.Name & vbCrLf
            cnt = cnt + 1
        End If
    Next i

    If cnt = 0 Then
        MsgBox "#REF! を含む名前はありません。", vbInformation
        Exit Sub
    End If

    If MsgBox(cnt & " 件の名前を削除します。よろしいですか?" & vbCrLf & vbCrLf & msg, _
              vbYesNo + vbExclamation) = vbNo Then Exit Sub

    For i = wb.Names.Count To 1 Step -1
        Set n = wb.Names(i)
        If IsDeleteTarget(wb, n) Then n.Delete
    Next i

    MsgBox cnt & " 件の名前を削除しました。", vbInformation
End Sub

Private Function IsDeleteTarget(wb As Workbook, n As Name) As Boolean
    Dim ref As String
    Dim ws As Worksheet
    Dim lo As ListObject

    On Error Resume Next
    ref = n.RefersTo
    On Error GoTo 0
    If InStr(ref, "#REF!") = 0 Then Exit Function

    ' Excel が使う名前は削除しない
    If InStr(n.Name, "Print_Area") > 0 Then Exit Function
    If InStr(n.Name, "Print_Titles") > 0 Then Exit Function
    If InStr(n.Name, "_FilterDatabase") > 0 Then Exit Function
    If InStr(n.Name, "_xlnm") > 0 Then Exit Function

    ' テーブル名は削除しない
    For Each ws In wb.Worksheets
        For Each lo In ws.ListObjects
            If lo.Name = n.Name Then Exit Function
        Next lo
    Next ws

    IsDeleteTarget = True
End Function

削除の前に、対象の名前と件数を確認するメッセージが出ます。マクロ1の例で実行すると、対象は「担当者」と「部署」の2件。「はい」を押すと「2 件の名前を削除しました。」と表示されます。

名前が多いと、確認メッセージには途中までしか表示されないことがあります。その場合は、マクロ1の一覧の「#REF!を含む」列で対象を確かめてください。ループを後ろから回しているのは、削除で番号がずれて名前を飛ばさないようにするためです。

#REF! ではない非表示の名前(例の「単価表」など)は、1件ずつ消します。VBEで Ctrl+G を押してイミディエイトウィンドウを開き、次の1行を入力して Enter キーを押してください。

ActiveWorkbook.Names("単価表").Delete

シート単位の名前なら、ActiveWorkbook.Names("東京!売上合計").Delete のように書きます。かっこの中には、マクロ1の一覧の「名前」列をそのまま入れてください。数式で使われていないかは、先に「Ctrl+F」で確かめておきましょう。

消せないときの回避策

名前の中には、名前の管理で削除しようとしても消えないもの、消すと困るものもあります。ケースごとの回避策を表にしました。

ケース回避策操作する場所
テーブル名テーブルを範囲に変換する「テーブルデザイン」タブ →「範囲に変換」
Print_Area・Print_Titles印刷範囲・印刷タイトルをクリアする「ページレイアウト」タブ →「印刷範囲」→「印刷範囲のクリア」など
保護されたブック保護を解除してから操作する「校閲」タブ →「ブックの保護」
どうしても消えない新しいブックへシートを移すシート見出しを右クリック →「移動またはコピー」

テーブル名が消えない場合

テーブル名は、名前の管理の「テーブル名」フィルターで別枠に表示されます。テーブルが残っている間は名前も消えないため、表としての機能が不要なら範囲に変換しましょう。古い版では「テーブルデザイン」タブが「デザイン」という名前なので、見当たらないときはそちらを探してください。

Print_Area・Print_Titles が競合する場合

印刷範囲や印刷タイトルを設定すると、「Print_Area」「Print_Titles」という名前が自動で作られます。これらがコピーのたびに確認の対象になる場合があります。名前の管理から削除するより、印刷範囲をクリアする方が安全です。

印刷タイトルは、「ページ設定」の「シート」タブで「タイトル行」「タイトル列」を空にすると解除できます。設定のやり直し方は、Excelの印刷設定ガイドで確認してください。

保護されたブックの場合

ブックの構成が保護されていると、シートのコピーや移動ができません。マクロ1も、シートを追加する時点でエラーになります。「校閲」タブの「ブックの保護」をクリックし、パスワードを入れて解除してから操作してください。

最終手段 新しいブックへシートを移す

どうしても原因の名前が消えないときは、使うシートだけを新しい空のブックへ移す方法があります。移動先に名前が無ければ、競合のダイアログは出にくくなります。

移した後は、新しいブックで名前の管理とマクロ1の一覧を確認しましょう。シートと一緒に持ち込まれた不要な名前があれば、そこで削除しておけばOKです。

よくある質問(FAQ)

同じブック内でシートを複製しても出るのはなぜ?

公式ヘルプが説明しているのは、別のブックへシートをコピーする場面です。同じブック内の複製で出る場合は、原因1・2・4の名前(同名・#REF!・非表示)が関係している可能性があります。マクロ1の一覧で、ダイアログに出てきた名前を探すところから始めてください。

「すべてはい」ボタンが表示されないのは?

公式ヘルプでは、「すべてはい」はサブスクリプション版(Microsoft 365)のみ表示とされています。買い切り型の Excel では表示されないことがあるため、その場合は1件ずつ「はい」か「いいえ」を選びます。何十回も押すのが大変なら、原因の名前を消すのが根本的な解決です。

名前を作った覚えがないのに競合するのはなぜ?

印刷範囲のように、Excelの操作で名前が自動的に作られることがあります。ほかのブックからシートをコピーしたときに、名前がついてくることもあるでしょう。古いテンプレートやアドインが非表示の名前を残しているケースもあります。

名前を削除しても大丈夫?

参照範囲が #REF! の名前は、参照先がすでに無いので消して困る場面は少ないでしょう。正常な名前は、使っているセルを Ctrl+F で確かめてから消してください。どちらの場合も、別名保存しておけば問題が起きても元に戻せます。


まずは名前の管理で「エラーのある名前」を確認してみてください。ダイアログに出た名前が見つからなければ、マクロ1で非表示の名前を洗い出しましょう。

名前のスコープや付け方を見直して再発を防ぐなら、Excelの「名前の定義」の使い方もあわせて読んでみてください。

タイトルとURLをコピーしました