- 최초 작성일: 2006-09-19
- 최종 수정일: 2026-09-30
- 조회수: 16 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 셀 병합 해제하고 값 채우기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
다음과 같은 질문이 올라왔습니다.
셀 병합 해제하고 값 채우기
핵심 요약: 병합 해제하고 빈 셀 채우기
병합된 셀 영역을 선택하고 실행하면 병합이 해제되고 빈 셀마다 위쪽 셀의 값이 채워지는 VBA 코드입니다. 피벗 테이블이나 필터 등을 쓰려면 이런 온전한 데이터베이스 형태가 필요합니다.
- 1단계: Selection.Unmerge로 병합을 해제합니다.
- 2단계: 빈 셀에 =R[-1]C 수식을 입력해 위쪽 값을 가져옵니다.
- 3단계: 수식을 값으로 바꾸어 마무리합니다.
Step 1: 어떤 질문이었을까요?
질문 하나
셀 병합을 하면 맨 위의 셀만 병합된 셀에 남는데 병합이 해제된 모든 셀에 같은 내용이 들어가도록 할 수는 없나요? 일일이 채워넣기 너무 힘들어요… ㅠ.ㅠ
셀 병합이 되어 있는 <표 1>과 같은 형태의 표를 <표 2>와 같이 만들고 싶으시단 것이지요?
<표 1> (병합된 상태)
| 순번 | 팀명 | 팀원 | 매출액 |
|---|---|---|---|
| 1 | A | A-1 | 40240 |
| 60010 | |||
| A-2 | 16540 | ||
| 2 | B | B-1 | 29200 |
| 89920 | |||
| B-2 | 80490 | ||
| 72230 | |||
| 3 | C | C-1 | 4480 |
| C-2 | 10220 |
<표 2> (병합을 해제하고 값을 채운 상태)
| 순번 | 팀명 | 팀원 | 매출액 |
|---|---|---|---|
| 1 | A | A-1 | 40240 |
| 1 | A | A-1 | 60010 |
| 1 | A | A-2 | 16540 |
| 2 | B | B-1 | 29200 |
| 2 | B | B-1 | 89920 |
| 2 | B | B-2 | 80490 |
| 2 | B | B-2 | 72230 |
| 3 | C | C-1 | 4480 |
| 3 | C | C-2 | 10220 |
<표 1>에서 셀 병합이 된 영역(빨간색으로 둘러싼 영역)을 범위로 지정하고 아래의 버튼을 눌러 보세요.
<표 1>과 같은 형태의 데이터는 데이터베이스로서의 활용 가치는 많이 떨어집니다. <표 2>와 같이 온전한 형태의 데이터베이스라야 엑셀의 막강한 분석 도구(피벗 테이블이나 필터, 정렬,…)을 제대로 활용할 수 있습니다.
Step 2: 코드 살펴보기
Const strID As String = "www.iExceller.com"
' 프로시저 바깥에 상수를 선언하고 값을 지정해 두었습니다.
Sub UnmergeAndFillValue()
Dim strAddress As String
On Error GoTo ET
' 유효하지 않은 개체를 선택하였거나 하는 경우에는 ET라는 레이블로 이동합니다.
strAddress = Selection.Address
With Selection
.Unmerge
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
' 워크시트 상에서 '빈 셀 채우기'를 할 때, '편집-이동' 메뉴에서 '옵션' 버튼을 클릭하고 '
' '빈 셀' 항목을 선택한 다음 후속 작업을 진행하게 됩니다. 이 과정을 엑셀이 알아먹도록
' 표현하면 위와 같이 됩니다.
End With
Range(strAddress).Select
' 아래 구문은 '빈 셀 채우기' 한 다음 수식이 입력된 부분을 '값 복사'하는 것입니다.
' 다른 방법도 있습니다만 SendKeys 메서드를 이용하면 더욱 간단히 해결할 수 있습니다.
SendKeys "{F2}"
SendKeys "{F9}"
SendKeys "{ENTER}"
Range(strAddress).Cells(1).Select
MsgBox "셀 병합을 해제하고 값 채우기를 완료하였습니다!", , strID
ET:
' 만약 프로그램 실행 도중 오류가 발생하면 제어를 이곳으로 옮겨와서 수행하게 됩니다.
If Err.Number <> 0 Then
MsgBox Err.Description, , "오류 번호 : " & Err.Number
Err.Clear
End If
End Sub
SendKeys 대신 값으로 바꾸는 방법: 원본 코드는 SendKeys로 F2, F9, Enter 키를 눌러 수식을 값으로 바꿉니다. SendKeys는 실행 환경에 따라 동작이 불안정할 수 있으므로, 최근에는 아래처럼 선택 영역의 값을 자기 자신에게 다시 대입하는 방식을 많이 씁니다.
Range(strAddress).Value = Range(strAddress).Value
빈 셀이 하나도 없는 경우: SpecialCells(xlCellTypeBlanks)는 빈 셀이 없으면 오류를 일으킵니다. 이 코드는 On Error 구문으로 ET 레이블로 이동해 오류 메시지를 보여 주도록 되어 있어서 별도의 처리가 필요하지 않습니다.
오늘 내용은 비록 코드는 짧지만 여러분의 업무에 많이 활용하실 수 있는 내용이라 생각됩니다. 많이 응용해 보세요!
다음에 또…
정리 — 병합 해제 및 값 채우기 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 병합 해제 | .Unmerge | 선택 영역의 병합을 해제 |
| 빈 셀 선택 | .SpecialCells(xlCellTypeBlanks) | 빈 셀만 골라냄 |
| 위쪽 값 참조 | .FormulaR1C1 = "=R[-1]C" | 바로 위 셀을 참조하는 수식 입력 |
| 값으로 변환 | SendKeys "{F2}", "{F9}", "{ENTER}" | 수식을 값으로 바꿈 |
| 오류 처리 | On Error GoTo ET | 오류가 나면 메시지를 보여 주고 종료 |
자주 묻는 질문 (FAQ)
Q1. 셀 병합을 해제하면 왜 값이 맨 위 셀에만 남나요?
병합된 셀은 왼쪽 위 셀 하나에만 값을 저장합니다. 병합을 해제하면 나머지 셀은 빈 셀이 되므로 이를 채워 주는 작업이 필요합니다.
Q2. 병합된 셀이 있는 표는 왜 데이터베이스로 쓰기 어렵나요?
행마다 모든 항목이 채워져 있어야 피벗 테이블, 필터, 정렬 같은 분석 기능이 제대로 동작합니다. 병합된 표는 빈 칸이 많아 이런 기능을 사용하기 어렵습니다.
Q3. 수식을 값으로 바꿀 때 SendKeys 말고 다른 방법이 있나요?
선택 영역의 Value를 자기 자신에게 대입하는 방식(Range.Value = Range.Value)을 쓰면 키 입력을 흉내 내지 않고도 수식을 값으로 바꿀 수 있습니다.
마치며
코드는 짧지만 실무에서 활용도가 매우 높은 내용입니다. 병합된 표를 온전한 데이터베이스 형태로 바꾸어 피벗 테이블 등 분석 도구를 마음껏 활용해 보세요.