• 최초 작성일: 2002-05-10
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 이름 복사하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번에는 이름 관련 질문 하나를 살펴봅니다. 예전에 이름을 사용하지 않고 만들어 둔 시트에 이름을 적용하려고 [삽입-이름-적용]을 실행하고 이름을 선택한 뒤 확인을 눌렀는데도 "적용할 참조가 없습니다"라는 메시지만 나오고 이름이 적용되지 않는다는 내용입니다. 수식을 하나하나 편집해서 이름을 붙여 넣는 것은 너무 힘들다며 수식에 이름을 적용하는 방법을 알려 달라고 하셨습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

이름 복사하기

핵심 요약: 정의된 이름 목록 확인과 복사

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로 한꺼번에 복사할 수 있습니다.