- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 시트를 이동하거나 복사할 때 발생하는 “이름이 중복됩니다” 오류의 원인과 해결 절차를 체계적으로 정리하여 실무자가 즉시 적용할 수 있도록 돕는 것이다.
1. 오류의 본질 이해: ‘정의된 이름’ 충돌이다
이 오류의 핵심은 통합 문서 또는 워크시트 범위로 정의된 정의된 이름(Name)이 대상 통합 문서 내에 이미 존재하여 충돌하는 상황이다. 이름 관리자에 보이지 않는 숨김 이름·외부 링크에 묶인 이름·자동 생성 이름도 원인이 될 수 있다. 표 이름(Table Name)과 피벗 이름, Power Query 쿼리 이름, 인쇄영역, 자동필터 이름 등이 포함된다.
2. 이름의 범위와 충돌 유형
정의된 이름은 두 가지 범위를 가진다.
- 통합 문서 범위 이름: 통합 문서 전체에서 유일해야 한다.
- 워크시트 범위 이름: 특정 시트에서만 유효하다. 동일한 이름을 다른 시트에서 가질 수 있으나 시트를 대상 통합 문서로 복사할 때 충돌할 수 있다.
| 유형 | 대표 예시 | 증상 | 해결 포인트 |
|---|---|---|---|
| 통합 문서 범위 이름 | TaxRate, ExchangeRate | 복사 시 즉시 오류 | 이름 변경 또는 병합 정의 필요 |
| 워크시트 범위 이름 | Print_Area, SalesRegion | 원본·대상 시트 둘 다 같은 이름 보유 | 시트 범위 이름 정리 후 복사 |
| 자동 생성 이름 | _FilterDatabase, Print_Titles | 보이지 않거나 자동 생성되어 반복 충돌 | 필터·인쇄영역 해제 후 삭제 |
| 표/피벗/쿼리 이름 | Table1, PivotTable1, Query1 | 개체명과 정의된 이름 충돌 | 개체명 재지정 또는 이름 관리자 정리 |
| 외부 링크 종속 이름 | [Budget.xlsx]!TaxRate | 대상 통합 문서 연결 시 충돌 | 링크 끊기·이름 재정의 |
| 숨김·손상 이름 | (Visible=False, 오류 참조) | 이름 관리자에서 안 보이거나 삭제 불가 | VBA로 강제 정리 |
3. 빠른 진단 체크리스트
- 이름 관리자 열기: 수식 > 이름 관리자에서 중복·오류·숨김 여부를 확인한다.
- 필터/인쇄영역 초기화: 자동필터와 인쇄영역을 해제해 _FilterDatabase, Print_Area 중복을 방지한다.
- 표·피벗·쿼리 이름 재정의: Table1, PivotTable1, Query1 등의 기본명을 의미 있는 고유명으로 바꾼다.
- 외부 링크 점검: 데이터 > 연결 편집에서 불필요한 연결을 제거하거나 값으로 고정한다.
- 숨김 이름 탐지: 이름 관리자 필터에서 숨김 포함을 확인하거나 VBA로 전체 나열한다.
4. 표준 해결 절차(권장 순서)
4.1 복사 전 원본 시트 정리
- 시트에서 모든 자동필터 해제를 수행한다.
- 페이지 레이아웃 탭에서 인쇄 영역 지우기를 실행한다.
- 표 개체는 표 디자인 > 표 이름을 고유하게 변경한다.
- 피벗 개체는 피벗테이블 분석 > 피벗테이블 이름을 변경한다.
- Power Query를 사용한다면 쿼리 이름을 고유하게 바꾼다.
4.2 이름 관리자에서 중복 일괄 정리
- 수식 > 이름 관리자에서 범위 열을 기준으로 정렬한다.
- 통합 문서 범위 이름 중 의미가 동일한 항목은 하나로 통합하고 나머지는 삭제 또는 참조를 변경한다.
- 워크시트 범위 이름이 원본·대상 모두에 존재하는 경우 이름을 변경한다.
- 값을 참조하는 에러(#REF!) 이름은 즉시 삭제한다.
4.3 충돌 회피 후 복사
- 시트 탭을 우클릭하여 이동 또는 복사를 선택하고 대상 통합 문서를 지정한다.
- 충돌이 지속되면 새 통합 문서로 먼저 복사한 뒤 필요한 이름만 가져오도록 조정한다.
5. 실무형 VBA 스크립트로 정밀 진단 및 정리
5.1 모든 이름을 목록화하여 충돌 탐지
Option Explicit
Sub ListAllNamesToSheet()
Dim nm As Name, ws As Worksheet, r As Long
On Error Resume Next
Application.ScreenUpdating = False
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "Name_Audit_" & Format(Now, "yyyymmdd_hhnnss")
With ws
.Range("A1:D1").Value = Array("Name", "Scope", "RefersTo", "Visible")
r = 2
For Each nm In ThisWorkbook.Names
.Cells(r, 1).Value = nm.Name
.Cells(r, 2).Value = IIf(nm.Parent Is Nothing, "Workbook", _
IIf(TypeName(nm.Parent) = "Worksheet", nm.Parent.Name, "Workbook"))
.Cells(r, 3).Value = nm.RefersTo
.Cells(r, 4).Value = nm.Visible
r = r + 1
Next nm
' 워크시트 범위 이름 포함 수집
Dim sh As Worksheet, nm2 As Name
For Each sh In ThisWorkbook.Worksheets
For Each nm2 In sh.Names
.Cells(r, 1).Value = nm2.Name
.Cells(r, 2).Value = sh.Name
.Cells(r, 3).Value = nm2.RefersTo
.Cells(r, 4).Value = nm2.Visible
r = r + 1
Next nm2
Next sh
.Columns("A:D").AutoFit
End With
Application.ScreenUpdating = True
End Sub
위 매크로는 통합 문서 및 워크시트 범위 이름을 모두 수집하여 가시성 여부와 참조 대상을 표로 만든다. 출력 시트에서 이름 열 기준으로 중복을 필터링하면 충돌 후보를 즉시 파악할 수 있다.
5.2 자동 생성 이름(_FilterDatabase, Print_Area) 자동 제거
Sub CleanAutoNames() Dim nm As Name For Each nm In ActiveWorkbook.Names If LCase(nm.Name) Like "*_filterdatabase*" Or LCase(nm.Name) Like "*print_area*" _ Or LCase(nm.Name) Like "*print_titles*" Then On Error Resume Next nm.Delete On Error GoTo 0 End If Next nm End Sub 5.3 숨김 이름 일괄 표시 또는 제거
Sub UnhideOrDeleteHiddenNames(Optional ByVal DeleteHidden As Boolean = False) Dim nm As Name For Each nm In ActiveWorkbook.Names If nm.Visible = False Then If DeleteHidden Then On Error Resume Next nm.Delete On Error GoTo 0 Else nm.Visible = True End If End If Next nm End Sub DeleteHidden:=True로 호출하면 숨김 이름을 즉시 정리한다. 권한·보호 상태에 따라 실패할 수 있으므로 먼저 표시 후 수동 검토를 권장한다.
5.4 오류 참조(#REF!) 이름과 외부 링크 이름만 제거
Sub PurgeBrokenAndExternalNames() Dim nm As Name For Each nm In ActiveWorkbook.Names Dim txt As String txt = LCase(nm.RefersTo) If InStr(txt, "#ref!") > 0 Or InStr(txt, "[") > 0 Then On Error Resume Next nm.Delete On Error GoTo 0 End If Next nm End Sub 대괄호가 포함된 참조는 외부 통합 문서 링크일 가능성이 높다. 연결을 유지해야 하면 삭제하지 말고 데이터 > 연결 편집에서 링크를 갱신하거나 값 고정 후 제거한다.
6. 수식 기반 자가 점검 시트 만들기
다음 수식을 사용하면 이름 목록을 동적으로 시트에 추출하고 중복을 진단할 수 있다. 365 이상 버전을 가정한다.
=LET( N, NAME.MANAGER(), /* 이름 관리자 테이블을 반환하는 사용자 정의 LAMBDA가 있다고 가정 */ Names, TAKE(CHOOSECOLS(N,1), ROWS(N)), Scope, CHOOSECOLS(N,2), Summary, HSTACK(Names, Scope), SORT(UNIQUE(Summary)) ) 기본 제공 함수만으로 이름 컬렉션을 직접 열람할 수는 없으나, 조직 표준 LAMBDA를 만들어 배포하면 일상 점검이 수월해진다. 대안으로 위 VBA를 사용한다.
7. Windows·Mac 공통 실무 팁
- 복사 대상 통합 문서 먼저 열기를 습관화한다. 열린 상태에서 이름 충돌 경고가 더 즉각적으로 발생하여 사전 조치가 수월하다.
- 이름 명명 규칙을 표준화한다. 예:
w_시트명_주제(워크시트 범위),wb_주제(통합 문서 범위)로 접두어를 구분한다. - 표 이름은 파일 단위 고유하게 관리한다. 부서·프로젝트 접두어를 붙인다.
- 주기적 정리를 자동화한다. 파일 저장 시 Workbook_BeforeSave 이벤트로 자동 이름 점검 루틴을 호출한다.
8. 복사가 꼭 필요한데 충돌이 해결되지 않을 때의 우회
- 원본 시트를 새 통합 문서로 복사한다.
- 새 통합 문서에서 위 절차로 이름을 완전 정리한다.
- 정리된 시트를 최종 대상 통합 문서로 복사한다.
이 방식은 대상 파일의 민감한 통합 문서 범위 이름과 분리된 환경에서 정리할 수 있다는 장점이 있다.
9. 빈번한 원인별 빠른 처방표
| 증상 | 원인 | 즉시 처방 |
|---|---|---|
| 복사 즉시 오류 | 통합 문서 범위 동일 이름 존재 | 이름 관리자에서 해당 이름을 변경 또는 삭제한다. |
| 필터 사용 후만 오류 | _FilterDatabase 자동 이름 중복 | 필터 해제 후 자동 이름 삭제 스크립트 실행한다. |
| 인쇄 후 오류 | Print_Area, Print_Titles 중복 | 인쇄 영역 지우기 실행 후 이름 삭제한다. |
| 특정 표 포함 시 오류 | Table1 등 기본 표 이름 충돌 | 표 이름을 고유하게 변경한다. |
| 외부 파일 연결 후 오류 | 외부 링크 기반 정의 이름 | 연결 편집에서 끊거나 값 고정 후 이름 삭제한다. |
| 이름 관리자에 안 보임 | 숨김·손상 이름 | VBA로 목록화 후 표시 또는 삭제한다. |
10. 품질 보증 체크리스트(배포 전)
- 이름 관리자에서 정렬 기준을 이름·범위·참조 대상으로 각각 적용해 이상값을 확인한다.
- Ctrl+F로 Table1, _FilterDatabase, Print_Area 키워드를 검색하여 잔존 여부를 확인한다.
- 외부 링크 수를 기록하고 불필요한 링크를 제거한다.
- 시험 파일로 시트 복사 리허설을 실행하여 오류 재현 여부를 점검한다.
11. 문제 재발 방지 표준
- 명명 규칙:
wb_접두어는 통합 문서 범위 전용,w_시트명_접두어는 워크시트 범위 전용으로 고정한다. - 자동 이름 최소화: 인쇄 영역·필터는 작업 종료 시 초기화한다.
- 개체 이름 정책: 표·피벗·쿼리는 파일 내 중복 금지 원칙을 적용한다.
- 정기 점검: 분기별로 이름 목록 보고서를 생성하여 아카이브한다.
FAQ
이름 관리자에서 삭제가 되지 않는 항목이 있다.
보호가 걸렸거나 숨김 속성, 외부 링크 종속일 가능성이 높다. 보호를 해제하고 숨김을 표시로 바꾸거나 VBA를 사용하여 삭제한다.
워크시트 범위 이름이 많은데 일괄로 다른 접두어로 바꾸고 싶다.
VBA로 Names 컬렉션을 순회하여 Name과 RefersTo를 보존하면서 새 이름으로 재정의한다.
시트 복사 대신 이동만 해도 오류가 난다.
대상 통합 문서가 열려 있고 동일한 이름을 보유하면 이동도 충돌한다. 절차는 동일하게 적용한다.
공유 통합 문서나 공동 편집 환경에서도 같은가.
정의된 이름 규칙은 같다. 공동 편집에서는 충돌 발생 시점이 늦게 드러날 수 있으므로 사전 정리가 중요하다.
매크로가 없는 .xlsx에서도 발생하나.
발생한다. 매크로 유무와 무관하게 정의된 이름 시스템에 의해 충돌이 발생한다.