- 최초 작성일: 2006-08-22
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 지점별로 일련번호 매기기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 시간에 값이 있는 셀에만 일련번호를 삽입하는 방법에 대해 살펴보았습니다. 기왕 일련번호에 대한 얘기가 나왔으니까 이와 관련된 것을 한 가지 더 살펴보도록 하겠습니다.
지점별로 일련번호 매기기
핵심 요약: 병합된 셀에 팀별 일련번호 매기기
팀원 수가 불규칙한 표에서 팀(병합 셀)마다 1, 2, 3… 번호를 붙이는 VBA 코드입니다. 병합 영역의 첫 번째 셀에만 번호를 입력하는 것이 핵심입니다.
- 1단계: C열에서 값이 있는 영역을 찾고 한 칸 왼쪽(순번 열)으로 옮겨 작업 영역을 정합니다.
- 2단계: 셀이 병합되어 있으면 MergeArea의 첫 셀과 현재 셀이 같은지 비교합니다.
- 3단계: 같은 경우에만 카운터를 늘려 번호를 입력합니다.
Step 1: 어떤 질문이었을까요?
질문 하나
무더운 날씨에 고생이 많으십니다. 휴가는 다녀 오셨는지요? 눈팅으로 자료만 가져가다가 급하게 해결해야 할 것이 있어서 첨 질문드립니다. 팀별로 팀원 이름이 있는 자료가 있습니다. 팀원별로 번호를 매기는 것은 쉽게 할 수가 있는데 팀별로 번호를 매길수 있는 방법이 있는지요?
함수식으로 해결할 수 있으면 좋고 VBA라도 상관 없습니다. 방법이 있다면 좀 알려 주세요. 참고로 팀별로 팀원수는 불규칙적입니다.
질문에 나온 표는 아래와 같은 모양입니다. 팀별로 팀원 수가 제각각이고, 순번 부분은 병합되어 있습니다.
| 순번 | 팀명 | 팀원 |
|---|---|---|
| 1 | A | A-1 |
| A | A-2 | |
| A | A-3 | |
| 2 | B | B-1 |
| B | B-2 | |
| B | B-3 | |
| B | B-4 | |
| 3 | C | C-1 |
| C | C-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. 팀 수나 팀원 수가 달라져도 코드를 고쳐야 하나요?
고치지 않아도 됩니다. 값이 들어 있는 영역을 코드가 스스로 찾아내고 병합 여부를 셀마다 확인하기 때문에 팀 수와 팀원 수에 관계없이 동작합니다.
마치며
수작업으로 한다면 어떤 과정을 거칠지를 먼저 고민해 보면 실마리가 보입니다. 병합된 셀은 첫 번째 셀에만 값이 있다는 점만 기억하시면 됩니다.