月次ブックのシートを別のブックへコピーしようとしたら、「○○という名前は既に存在します」という趣旨の確認が出てきた。しかも「はい」を押しても、次から次へと同じダイアログが続く。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ステップ。
- Ctrl+F3 で名前の管理を開く
- 「フィルター」から「エラーのある名前」を選ぶ
- 先頭の名前をクリックし、Shift キーを押しながら最後の名前をクリックする
- 「削除」を押し、確認で「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の「名前の定義」の使い方もあわせて読んでみてください。
