- 최초 작성일: 2025-01-24
- 최종 수정일: 2026-09-27
- 조회수: 23 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 250회 - 병합 해제하고 값 채우기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
몰입할 대상이 있다는 것
무언가 몰입할 대상이 있다는 건 멋진 일입니다. 여러분들에게 그 대상 중 하나가 VBA가 되길 기대해 봅니다.
셀 병합을 해제하고 값을 채워넣는 Code
핵심 요약: 병합된 셀을 풀고 빈 셀에 위쪽 값 채우기
UnMerge로 병합을 해제하고, SpecialCells(xlCellTypeBlanks)로 찾은 빈 셀에 바로 윗 셀을 참조하는 수식을 입력한 뒤 값으로 붙여넣으면 피벗 테이블, 필터, 정렬을 쓸 수 있는 온전한 표가 됩니다.
- 문제: 병합된 셀이 있으면 데이터베이스로서 활용도가 떨어짐
- 범위 선택: Application.InputBox(Type:=8)로 영역 지정
- 핵심 코드: .UnMerge → .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" → 값 붙여넣기
- 대안: PasteSpecial 대신 SendKeys 메서드 사용 가능
병합된 셀을 해제하고 값 채우기
표 내부에 병합된 셀이 있으면 데이터베이스로서 활용도가 떨어집니다. [표 2]와 같이 온전한 형태의 테이블 구조가 되어야 엑셀의 다양한 분석 도구(피벗 테이블이나 필터, 정렬 등)들을 제대로 활용할 수 있습니다. '값 채우기' 버튼을 클릭하고 범위를 지정하면 [표 1]과 같은 테이블이 [표 2]와 같은 형태로 바뀝니다.
'값 채우기' 버튼에 연결된 코드
'값 채우기' 버튼에 연결된 코드는 다음과 같습니다.
Sub UnmergeAndFillValue()
Dim rngTarget As Range ' 작업 대상 영역에 접근하기 위한 변수
Dim strAddress As String ' 선택 영역의 주소를 저장하기 위한 변수
On Error GoTo ET ' 오류 발생 시 ET 레이블로 이동
strAddress = "A3:C11" ' 작업 대상 영역의 주소를 변수에 할당
Set rngTarget = Application.InputBox("영역을 선택하세요", Type:=8, Default:=strAddress)
' InputBox 함수를 이용하여 작업 대상 영역 선택
With rngTarget ' 작업 대상 영역에 대하여...
.UnMerge ' 셀 병합 해제
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
' 공백 셀인 경우 바로 윗 셀 값을 가져옴.
.Copy ' 셀 복사
.PasteSpecial Paste:=xlPasteValues ' 값 붙여넣기
End With
Application.CutCopyMode = False ' 셀 선택 모드 해제
ET: ' 실행 도중 오류가 발생한 경우 이 곳으로 이동
If Err.Number <> 0 Then
MsgBox Err.Description, , "오류 번호 : " & Err.Number
Err.Clear
End If
End Sub
PasteSpecial 대신 SendKeys 메서드 이용하기
PasteSpecial 대신에 SendKeys 메서드를 이용할 수도 있겠습니다. 위 코드에서 With ~ End With 부분을 다음 코드로 대체하면 됩니다.
With rngTarget
.UnMerge
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
End With
Range(strAddress).Select
SendKeys "{F2}"
SendKeys "{F9}"
SendKeys "{ENTER}"
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다. 첫머리의 그림은 원본이 아니라 '몰입'의 의미를 표현하려고 새로 그린 것이고, [표 1], [표 2]의 지역, 지점, 매출 데이터는 예시입니다.
정리 — 병합 해제 후 값 채우기 코드의 구성
| 코드 | 역할 |
|---|---|
| Application.InputBox(Type:=8) | 작업 대상 영역을 마우스로 선택받음 (기본값 A3:C11) |
| .UnMerge | 선택 영역의 셀 병합 해제 |
| .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" | 빈 셀만 골라 바로 윗 셀의 값을 가져오는 수식 입력 |
| .Copy, .PasteSpecial xlPasteValues | 수식을 값으로 변환 (SendKeys 방식으로 대체 가능) |
| On Error GoTo ET | 오류 발생 시 오류 번호와 설명을 메시지 상자로 표시 |
자주 묻는 질문 (FAQ)
Q1. 표에 병합된 셀이 있으면 왜 문제가 되나요?
표 내부에 병합된 셀이 있으면 데이터베이스로서 활용도가 떨어집니다. 피벗 테이블, 필터, 정렬 같은 엑셀의 분석 도구를 제대로 쓰려면 병합이 없는 온전한 형태의 테이블 구조가 되어야 합니다.
Q2. 병합을 해제한 뒤 생긴 빈 셀은 어떻게 채우나요?
SpecialCells(xlCellTypeBlanks)로 빈 셀만 골라 FormulaR1C1 = "=R[-1]C"를 입력하면 바로 윗 셀의 값을 가져옵니다. 그런 다음 복사하여 값으로 붙여넣으면 수식이 값으로 바뀝니다.
Q3. 선택한 범위에 빈 셀이 없으면 어떻게 되나요?
SpecialCells는 조건에 맞는 셀이 없으면 오류가 발생합니다. 예제 코드는 On Error GoTo ET로 오류를 처리하여 오류 번호와 설명을 메시지 상자로 보여 줍니다.
마치며
병합된 셀만 풀어도 표가 훨씬 쓸 만한 데이터로 바뀝니다. 코드 몇 줄로 한 번에 끝내 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.