- 최초 작성일: 2002-09-18
- 최종 수정일: 2026-09-30
- 조회수: 17 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 동일한 값의 셀 병합하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Our greatest glory consists not in never falling but in rising every time we fall. 인간에게 있어 최대 영광은 한번도 실패하지 않는 것이 아니라 실패할 때마다 일어나는 것이다.
개인적으로 좋아하는 구절 중 하나입니다. '일어나면 또 쓰러질텐데' 하고 계속 누워만 있다면 결코 성공할 수 없겠지요.
동일한 값의 셀 병합하기
핵심 요약: 같은 값의 셀 자동 병합
각 셀 아래로 같은 값이 얼마나 이어지는지를 세고, 이어지는 만큼을 하나의 범위로 묶어 Merge로 병합합니다.
- 1단계: InputBox(Type:=8)로 병합할 영역을 지정받습니다.
- 2단계: 각 셀의 아래쪽 셀을 Offset으로 비교하며 같은 값의 개수를 셉니다.
- 3단계: 개수가 1 이상이면 해당 범위를 Merge하고 세로 가운데 정렬합니다.
Step 1: 어떤 질문이었을까요?
A열에 같은 내용의 글자가 위아래로 연속해서 나열되어 있을 때, 같은 내용끼리 셀 병합을 하고 싶은데 VBA로 어떻게 작성해야 하느냐는 질문이었습니다. 예를 들어 가, 가, 가, 나, 나, 다, 라, 라, 라가 입력되어 있으면 가·나·다·라 각각 하나의 셀로 병합하는 것입니다.
아주 오래 전(X0005 강좌에서 였군요) EXCEL 강좌에서 소개해 드린 '빈 셀 채우기'와 반대의 경우에 대해 질문이로군요. 즉 [표 1]과 같은 형태의 자료를 [표 2]와 같이 바꾸어 줄 수 없느냐 하는 것입니다.
[표 1]
| 지점명 | 특약점명 | 매출액 |
|---|---|---|
| 영등포 | 1호점 | 1000 |
| 영등포 | 2호점 | 1200 |
| 영등포 | 3호점 | 1250 |
[표 2]
| 지점명 | 특약점명 | 매출액 |
|---|---|---|
| 영등포 | 1호점 | 1000 |
| (병합) | 2호점 | 1200 |
| (병합) | 3호점 | 1250 |
Step 2: 동일한 값의 셀을 병합하는 코드
안될리가 없겠지요? ^^ 아래 버튼을 눌러 보세요.
상식적으로 될 것 같거나, 수작업으로 처리가 가능한 것이라면 얼마든지 자동화가 가능하답니다. 코드를 살펴보면…
Sub SameCellMerge()
Dim rngTarget As Range
Dim rngCell As Range
Dim strAddress As String
Dim intNum As Long
Dim intCount As Long
Dim intTemp2 As Long
Dim intTemp As Long
Dim i As Long
Application.DisplayAlerts = False
On Error GoTo ET
strAddress = [Branch].Address
Set rngTarget = Application.InputBox("대상 영역을 선택하세요", "영역 선택", Type:=8, Default:=strAddress)
intNum = rngTarget.Cells.Count
' 사용자로부터 대상 영역을 입력받습니다. 편의상 지점명 부분에 Branch라는 이름을 미리
' 정의해 두고 사용하였습니다. 그리고 선택된 영역의 셀 수를 카운팅하여 intNum 변수에
' 담아 둡니다.
For Each rngCell In rngTarget
intTemp = intTemp + 1
intTemp2 = intNum - intTemp
' 현재 셀의 위에 있는 셀(들)들을 검색하기 위해 여러 가지 변수들을 활용하였습니다.
' 하나의 셀에 대한 검색이 끝날 때마다 검색해야 할 대상 셀이 하나씩 줄어들게 되므로
' 어떤 변수는 값이 증가하는 반면, 또다른 변수는 값이 차례로 줄어듭니다.
' 아래의 구문에서도 마찬가지입니다. 눈으로만 보지 말고 종이를 한장 펼쳐놓고 각 변수의
' 값을 차례로 대입시켜 보면 쉽게 이해가 되실 것입니다.
If Len(rngCell) > 0 Then
i = 0
For intCount = 1 To intTemp2
If rngCell.Offset(intCount, 0) = rngCell Then
i = i + 1
Else
Exit For
End If
Next intCount
If i > 0 Then Range(rngCell, rngCell.Offset(i, 0)).Merge
' I 변수의 값이 0보다 크다는 말은 같은 값이 하나 이상 있다는 의미입니다. 이런 경우에만
' Merge 메서드를 사용하여 셀을 병합합니다.
End If
Next rngCell
rngTarget.VerticalAlignment = xlCenter
Application.DisplayAlerts = True
Exit Sub
ET:
Application.DisplayAlerts = True
MsgBox "영역 선택이 잘못되었습니다. 영역을 다시 선택하세요!", , "에러 번호: " & Err.Number
End Sub
각 셀에 대해 바로 아래 셀들을 차례로 비교하면서 같은 값이 몇 개 연속되는지를 i 변수에 셉니다. i가 0보다 크면 같은 값이 하나 이상 있다는 뜻이므로 그 범위를 Merge 메서드로 병합합니다. 여러 가지 카운팅 변수의 값이 어떻게 변하는지 종이에 적어 보시면 원리를 쉽게 이해하실 수 있습니다.
오늘은 여기까지…
정리 — 동일값 셀 병합 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 영역 입력 | Application.InputBox(..., Type:=8) | 병합할 영역 선택 |
| 아래 셀 비교 | rngCell.Offset(intCount, 0) = rngCell | 같은 값 여부 확인 |
| 병합 | Range(rngCell, rngCell.Offset(i, 0)).Merge | 연속된 셀 병합 |
| 정렬 | rngTarget.VerticalAlignment = xlCenter | 세로 가운데 맞춤 |
| 경고 끄기 | Application.DisplayAlerts = False | 병합 경고창 방지 |
자주 묻는 질문 (FAQ)
Q1. 같은 값이 연속된 셀은 어떻게 찾나요?
각 셀에서 Offset으로 아래 셀을 하나씩 비교하며 값이 같은 동안 카운트를 늘리고, 다르면 반복을 멈춥니다.
Q2. 셀을 병합하면 나타나는 경고는 어떻게 없애나요?
작업 중에는 Application.DisplayAlerts를 False로 지정하고, 작업이 끝나면 다시 True로 되돌립니다.
Q3. 비어 있는 셀은 어떻게 처리하나요?
Len(rngCell) > 0 조건으로 값이 있는 셀만 검사하므로 병합된 영역의 빈 셀은 건너뜁니다.
마치며
사람이 눈으로 하면 할 수 있는 일은 대부분 코드로 자동화할 수 있습니다. 카운팅 변수의 변화를 차근차근 따라가 보시기 바랍니다.