- 최초 작성일: 2002-05-10
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 이름 복사하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번에는 이름 관련 질문 하나를 살펴봅니다. 예전에 이름을 사용하지 않고 만들어 둔 시트에 이름을 적용하려고 [삽입-이름-적용]을 실행하고 이름을 선택한 뒤 확인을 눌렀는데도 "적용할 참조가 없습니다"라는 메시지만 나오고 이름이 적용되지 않는다는 내용입니다. 수식을 하나하나 편집해서 이름을 붙여 넣는 것은 너무 힘들다며 수식에 이름을 적용하는 방법을 알려 달라고 하셨습니다.
이름 복사하기
핵심 요약: 정의된 이름 목록 확인과 복사
Names 컬렉션을 For Each로 순환하면 정의된 이름을 모두 얻을 수 있고, 새 통합 문서의 Names.Add로 그대로 옮길 수 있습니다.
- 1단계: ThisWorkbook.Names를 순환하여 이름과 RefersTo를 표시합니다.
- 2단계: 새 통합 문서를 만들고 시트 수와 이름을 원본과 똑같이 맞춥니다.
- 3단계: 이름마다 Names.Add로 새 통합 문서에 추가합니다.
Step 1: 정의된 이름 살펴보기
현재 워크북에 정의되어 있는 이름을 다른 통합 문서로 옮겨야 할 경우가 있을 때 정의된 이름들을 하나하나 옮기고 앉아 있는 것은 VBA를 배우는 사람으로서의 도리(←이런 게 있는 지 모르겠지만… ^^;)가 아니겠지요?
일단 현재 워크북에 어떤 이름들이 정의되어 있는지 살펴보도록 하지요. 아래의 버튼을 눌러 보세요!
버튼을 누르면 현재 통합 문서에 정의된 모든 이름과 그 참조 대상이 시트에 표시됩니다.
Sub ScanNamesInWorksheet()
Dim nmeName As Name
Dim rngCell As Range
Dim i As Integer
Set rngCell = [ScanName]
[ScanName].CurrentRegion.ClearContents
' 위의 빨간색 셀에 ScanName 이라는 이름을 미리 정의 해 두었습니다.
For Each nmeName In ThisWorkbook.Names
' 현재 워크북에 정의되어 있는 모든 이름을 순환문을 사용하여 접근합니다. 접근해서
' 뭐하느냐 하면… 기준 셀(즉 ScanName)을 중심으로 하여 해당 정보를 표시합니다.
With rngCell
.Offset(i, 0) = nmeName.Name
.Offset(i, 1) = "'" & nmeName.RefersTo
i = i + 1
End With
Next nmeName
MsgBox ThisWorkbook.Names.Count & "개의 이름이 정의되어 있습니다", , "www.iExceller.com"
End Sub
ThisWorkbook.Names 컬렉션을 순환문으로 훑으면서 기준 셀(ScanName 이름이 지정된 셀)을 중심으로 이름과 참조 대상을 표시합니다. 표시하기 전에 기준 셀 주변의 기존 내용은 지웁니다.
Step 2: 이름을 새 파일로 한꺼번에 옮기기
이제 현재 파일에 정의된 이름을 새로운 파일을 하나 만들어서 한꺼번에 몽땅 옮깁니다.
Sub TransferNames()
Dim objName As Name
Dim wrkNewBook As Workbook
Dim wrkOldBook As Workbook
Dim shtSheet As Worksheet
Dim intShtNum As Integer
Dim i As Integer
Dim strShtName() As String
Dim Msg As String
Dim intOldCnt As Integer
intShtNum = Sheets.Count
ReDim strShtName(intShtNum)
' strShtName 이라는 그릇(동적 배열 변수)을 하나 준비해 둡니다. 그런 다음 현재 파일에
' 몇 개의 시트가 있는지 확인하고 배열의 크기를 재설정(ReDim) 합니다.
Set wrkOldBook = ActiveWorkbook
For i = 1 To intShtNum
strShtName(i) = Sheets(i).Name
Next i
' 현재 파일의 각 시트 이름을 배열에 차곡차곡 담아 둡니다.
intOldCnt = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = intShtNum
Set wrkNewBook = Workbooks.Add
Application.SheetsInNewWorkbook = intOldCnt
' 파일을 새로 하나 만들고 시트 수를 현재 통합 문서와 똑같이 만듭니다.
For i = 1 To intShtNum
Sheets(i).Name = strShtName(i)
Next i
' 두 파일의 구조를 똑같이 맞추기 위해 시트명도 마찬가지로 일치 시킵니다.
For Each objName In wrkOldBook.Names
wrkNewBook.Names.Add Name:=objName.Name, RefersTo:=objName.Value
Next objName
' 이 부분이 오늘 강좌의 핵심입니다. 현재 워크북의 이름을 wrkNewBook, 즉 새로운
' 통합 문서에 하나씩 추가해 나갑니다.
Msg = Msg & ThisWorkbook.Names.Count
Msg = Msg & "개의 이름을 복사하였습니다" & vbCr
Msg = Msg & "이름 상자를 눌러 확인해 보세요!"
MsgBox Msg, , "www.iExceller.com"
End Sub
핵심은 현재 통합 문서의 Names 컬렉션을 순환하면서 새 통합 문서의 Names.Add 메서드로 이름을 하나씩 추가하는 부분입니다. 참조 대상이 시트 이름을 포함하므로 시트 수와 시트 이름을 미리 똑같이 맞춰 둡니다.
실행하면 순식간에 이름이 모두 옮겨지며, 이름 상자를 눌러 확인해 볼 수 있습니다.
참고: 이름 상자에 나타나는 이름 중 통합 문서 전체 범위가 아니라 특정 시트에만 적용된 이름은 시트명!이름 형태로 표시됩니다. 이런 이름은 대상 시트가 있어야 복사되므로 예제처럼 시트 이름까지 맞추어 두는 것이 안전합니다.
다음 시간에 또…
정리 — 이름 복사 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 이름 순환 | For Each nmeName In ThisWorkbook.Names | 정의된 모든 이름 접근 |
| 참조 대상 | nmeName.RefersTo | 이름이 가리키는 주소 |
| 새 통합 문서 | Workbooks.Add | 복사 대상 파일 |
| 시트 수 맞춤 | Application.SheetsInNewWorkbook | 시트 수 일치 |
| 이름 추가 | Names.Add Name, RefersTo | 이름 복사 |
자주 묻는 질문 (FAQ)
Q1. 정의된 이름을 목록으로 보려면 어떻게 하나요?
Names 컬렉션을 For Each로 순환하면서 각 Name 오브젝트의 Name과 RefersTo 속성을 셀에 기록하면 됩니다.
Q2. 왜 새 통합 문서의 시트 이름을 똑같이 맞추나요?
이름의 참조 대상이 시트 이름을 포함하고 있으므로 같은 시트 구조를 갖추어야 이름이 올바르게 복사됩니다.
Q3. 이름이 적용되지 않는다는 메시지는 무엇인가요?
질문에 나온 "적용할 참조가 없습니다" 메시지는 수식에 이름을 적용하는 기능에서 대상 참조를 찾지 못했을 때 표시됩니다. 이번 강좌는 이름 자체를 다른 파일로 옮기는 방법을 다룹니다.
마치며
정의된 이름을 하나하나 옮기지 않고 Names 컬렉션과 Names.Add로 한꺼번에 복사할 수 있습니다.