• 최초 작성일: 2006-08-22
  • 최종 수정일: 2026-09-30
  • 조회수: 14 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 지점별로 일련번호 매기기

들어가기 전에

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

지난 시간에 값이 있는 셀에만 일련번호를 삽입하는 방법에 대해 살펴보았습니다. 기왕 일련번호에 대한 얘기가 나왔으니까 이와 관련된 것을 한 가지 더 살펴보도록 하겠습니다.

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

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

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


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

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

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

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

지점별로 일련번호 매기기

핵심 요약: 병합된 셀에 팀별 일련번호 매기기

팀원 수가 불규칙한 표에서 팀(병합 셀)마다 1, 2, 3… 번호를 붙이는 VBA 코드입니다. 병합 영역의 첫 번째 셀에만 번호를 입력하는 것이 핵심입니다.

  • 1단계: C열에서 값이 있는 영역을 찾고 한 칸 왼쪽(순번 열)으로 옮겨 작업 영역을 정합니다.
  • 2단계: 셀이 병합되어 있으면 MergeArea의 첫 셀과 현재 셀이 같은지 비교합니다.
  • 3단계: 같은 경우에만 카운터를 늘려 번호를 입력합니다.

Step 1: 어떤 질문이었을까요?

질문 하나

무더운 날씨에 고생이 많으십니다. 휴가는 다녀 오셨는지요? 눈팅으로 자료만 가져가다가 급하게 해결해야 할 것이 있어서 첨 질문드립니다. 팀별로 팀원 이름이 있는 자료가 있습니다. 팀원별로 번호를 매기는 것은 쉽게 할 수가 있는데 팀별로 번호를 매길수 있는 방법이 있는지요?

함수식으로 해결할 수 있으면 좋고 VBA라도 상관 없습니다. 방법이 있다면 좀 알려 주세요. 참고로 팀별로 팀원수는 불규칙적입니다.

질문에 나온 표는 아래와 같은 모양입니다. 팀별로 팀원 수가 제각각이고, 순번 부분은 병합되어 있습니다.

순번팀명팀원
1AA-1
AA-2
AA-3
2BB-1
BB-2
BB-3
BB-4
3CC-1
CC-2

만약 팀명 부분이 병합되어 있다면 함수를 사용하여 간단하게 해결할 수 있지만 위와 같은 형태에서 순번 부분에 일련번호를 삽입해야 한다면 VBA를 사용하여 해결할 수 있습니다.

지점이 몇 개이든 팀원이 몇 명이든 상관없이 되지요?

Step 2: 코드 살펴보기

Const strID As String = "www.iExceller.com"
' 프로시저 바깥에 상수를 선언하고 값을 지정해 두었습니다.
' 이렇게 하면 다른 프로시저에서도 매번 별도로 선언할 필요없이 사용할 수 있게 됩니다.

Sub SerialNumber()

    Dim rngCell As Range
    Dim rngTarget As Range
    Dim i As Integer
    Dim strMsg As String

    Set rngTarget = Columns(3).SpecialCells(xlTextValues).Offset(1, -1)
    Set rngTarget = rngTarget.Resize(rngTarget.Cells.Count - 1, 1)
    ' 작업 영역은 Workplace 시트의 B3:B28 셀 입니다.
    ' 이것을 찾아내는 방법을 눈여겨 보시기 바랍니다.
    ' 일단 C열에서 값이 들어있는 영역을 찾아낸 다음 옆으로 1열 이동하고 Resize 메서드를
    ' 이용하여 크기를 조정합니다.

    strMsg = "작업 대상 영역의 내용을 모두 지웠습니다." & vbCr
    strMsg = strMsg & "이제 순번을 새로 매깁니다."

    rngTarget.ClearContents
    MsgBox strMsg, , "www.iExceller.com"

    For Each rngCell In rngTarget
        With rngCell
            If .MergeCells Then
            ' rngTarget 영역 내의 셀이 병합된 셀인지 여부를 하나씩 점검해 나갑니다.
            ' 병합된 셀이라면 병합된 영역을 rngTarget으로 다시 지정(assign)하고
            '  rngCell의 셀 주소와 rngTarget 중 첫번째 셀의 주소가 같은 지를 비교합니다.
            ' 같으면 변수 i 값을 1 증가시킨 다음 셀에 표시합니다.

                Set rngTarget = .MergeArea

                If .Address = rngTarget.Cells(1).Address Then
                    i = i + 1
                    .Value = i
                End If
            Else
            ' 그렇지 않으면, 즉 셀에 병합되지 않았으면 변수 i 값을 1 증가시키고 셀에 표시합니다.

                i = i + 1
                .Value = i
            End If
        End With
    Next rngCell

End Sub

SpecialCells(xlTextValues)에 대하여: 이름과 달리 xlTextValues는 수식이 아닌 상수(Constants) 중 문자만이 아니라 숫자 등도 골라내는 방식으로 동작하는 것으로 알려져 있습니다. 예제에서는 팀명 열(C열)이 모두 문자로 채워져 있기 때문에 문제가 없지만, 다른 데이터에 적용할 때는 결과 범위를 꼭 확인해 보세요.

이번 강좌 역시 지난 시간과 마찬가지로 수작업으로 한다면 어떤 과정을 거쳐 처리하는가를 잘 고민해 보시면 실마리를 찾을 수 있는 그런 유형이 되겠습니다.

다음에 또…

정리 — 팀별 일련번호 코드 핵심

구분 사용한 코드 역할
작업 영역 찾기 Columns(3).SpecialCells(xlTextValues).Offset(1, -1) C열의 값 영역을 찾아 순번 열로 이동
크기 조정 rngTarget.Resize(...) 머리글 행만큼 줄여 영역을 맞춤
병합 여부 .MergeCells 셀이 병합되어 있는지 확인
병합 영역 .MergeArea 병합된 전체 영역을 가져옴
첫 셀 비교 .Address = rngTarget.Cells(1).Address 병합 영역의 첫 셀일 때만 번호 입력

자주 묻는 질문 (FAQ)

Q1. 병합된 셀에서 값이 왼쪽 위 셀에만 들어가는 이유는 무엇인가요?

엑셀은 병합된 영역의 값을 왼쪽 위 셀 하나에만 저장하고 나머지 셀은 비어 있는 것으로 취급합니다. 그래서 병합 영역의 첫 번째 셀에만 번호를 입력하면 됩니다.

Q2. 팀명 부분이 병합되어 있다면 함수만으로 해결할 수 있나요?

네, 가능합니다. 팀명이 병합되어 있으면 함수를 이용해 간단하게 번호를 매길 수 있습니다. 이번 강좌처럼 순번 열이 병합된 경우에는 VBA를 사용해야 합니다.

Q3. 팀 수나 팀원 수가 달라져도 코드를 고쳐야 하나요?

고치지 않아도 됩니다. 값이 들어 있는 영역을 코드가 스스로 찾아내고 병합 여부를 셀마다 확인하기 때문에 팀 수와 팀원 수에 관계없이 동작합니다.

마치며

수작업으로 한다면 어떤 과정을 거칠지를 먼저 고민해 보면 실마리가 보입니다. 병합된 셀은 첫 번째 셀에만 값이 있다는 점만 기억하시면 됩니다.