VBA로 셀병합 해제 후 빈셀 채우기(빈셀 채우기와 찰떡궁합!)
병합되어 있는 표는 피벗테이블을 사용할 때 오류 발생이 높은 형태로 알려져 있습니다. 오류를 최소화하기 위해서는 셀병합은 되도록이면 사용하지 않는 습관을 들이는 것이 가장 좋을 것입니다. 그럼에도 병합을 꼭 해야 하는 상황이 발생할 수도 있는데요. VBA를 통해 셀병합을 해제하고 빈셀을 채워 넣는 프로시저를 작성해 보도록 하겠습니다.
VBA로 셀병합 해제 후 빈셀 채우기
엑셀 빈칸을 VBA로 채우는 방법에 대해 알아보았는데요. 만약 셀병합이 되어 있다면 기존 방법으로는 해결이 불가하게 될 거예요. 그럼 어떤 방법을 사용해야 할까요? 먼저 셀병합을 해제한 후 빈셀을 채우는 형태로 진행해야 할 텐데요.
예시를 한번 보시죠.
먼저 병합되어 있는 셀을 해제해야 할 텐데요. 간단하게 병합된 셀범위를 선택하신 후 『병합하고 가운데 맞춤』을 눌러주시면 병합이 해제되는 걸 보실 수 있습니다.
여기까지는 앞에서 배웠던 빈셀 채우기와 동일합니다. VBA를 통해서 반영하는 방법도 배웠었죠.
VBA를 사용한 빈셀 채우기는 아래 링크에서 확인해 주세요!
그럼 이제 본격적으로 병합해제 후 빈셀을 채우는 매크로를 작성해 볼까요?
Sub 병합해제() Dim rng As Range, c As Range, r As Range Set rng = Range("a2", Cells(Rows.Count, "a").End(xlUp)) ' A2셀부터 데이터가 있는 마지막 셀까지를 범위로 잡습니다. For Each c In rng ' rng범위 내의 셀 하나하나를 확인하는 반복문을 시작합니다. If c.MergeArea.Cells(1).Address = c.Address Then ' IF문을 사용하여 c셀의 첫번째 위치의 셀주소가 c셀의 주소와 같다면 ' 병합된 셀의 가장 첫번째 셀과 위치가 같다는 것을 의미 Set r = c.MergeArea ' r변수에 병합된 셀을 담아줍니다. c.MergeArea.UnMerge ' 병합된 셀을 해제합니다. r.FillDown ' 윗셀에 있는 데이터를 그대로 채워줍니다. End If Next Cells(Rows.Count, "a").End(xlUp).BorderAround LineStyle:=xlContinuous, Weight:=xlThin, ColorIndex:=1 ' 경계선의 테두리를 표현해줍니다. End Sub |
하나씩 세부내용을 확인해 보도록 하시죠!
Dim rng As Range, c As Range, r As Range는 변수 선언이라는 것은 이제 다들 아실 거라고 믿어요.
다음부터는 해당 설명은 생략토록 하겠습니다!
Set rng = Range("a2", Cells(Rows.Count, "a").End(xlUp))는 rng의 범위를 설정하여 rng변수에 담아놓은 것을 의미하는데요. Cells(Rows.Count, "a").End(xlUp)는 자주 사용되는 범위설정방법이니 꼭 외워두시라고 말씀드리고 있습니다.
For Each c In rng을 사용하여 반복문의 시작을 알립니다.
지금부터가 셀병합해제 후 빈셀 채우기의 핵심인 부분입니다.
예제를 보시면 빨간 테두리와 파란 테두리가 구분되어 있는 것을 주의 깊게 보셔야 합니다. 빨간 테두리는 "A6, A7, A8셀"이 병합되어 있는 셀을 의미하며, 파란 테두리는 "A6, A7, A8셀" 병합 중 "A6셀"만을 의미한다고 생각하시면 됩니다.
그럼 이것을 토대로 다음 코드를 확인해 보겠습니다.
If c.MergeArea.Cells(1).Address = c.Address Then는 If문을 사용하여 병합된 셀의 첫 번째 셀이 c셀의 주소와 같다면,
Set r = c.MergeArea을 통해 병합된 셀 범위를 r이라는 변수에 담아줍니다. 이를 풀어서 말씀드리자면 빨간색 테두리 중 첫 번째 위치한 셀주소와 순차적으로 내려오는 파란색 셀 주소가 일치하면 r변수에 담아주겠다는 내용입니다.
c.MergeArea.UnMerge를 통해 셀병합되어있는 셀묶음들을 병합해제해 줍니다. 병합 묶음이 해제되어도 r이라는 변수에 담아두었기 때문에 병합돼 있던 셀 전체의 범위를 순차적으로 잡을 수 있게 됩니다. 따라서 r.FillDown을 사용하여 첫 번째 셀에 위치한 데이터들을 빈센에 채워주는 역할을 하게 되는 것이죠.
FillDown은 빈셀 채우기에 사용했었던 SpecialCells(xlCellTypeBlanks).Formula = "a2")와 동일한 역할을 한다라고 생각하시면 좋을 듯합니다.
마지막에는 Cells(Rows.Count, "a").End(xlUp).BorderAround LineStyle:=xlContinuous, Weight:=xlThin, ColorIndex:=1을 사용하여 주었는데요. 병합해제와 filldown을 하면서 외부 테두리가 사라지는 경우를 대비하여 외곽선을 넣어주는 코드이니 참고하시고 스킵해 주시면 됩니다.
마치며
지금까지 셀병합 해제 후 빈셀채우는 방법을 매크로를 통해 구현해 보았는데요. 아무래도 구두로 설명을 드리려다 보니 쉽게 설명하지 못한 부분이 있는 것 같네요. 코드를 통해 연습을 해보시고 잘 안 풀리는 부분이 있다면 언제든 댓글로 문의를 남겨주세요. 확인하는 대로 코드를 수정하여 답글 남겨드리도록 하겠습니다.
▼▼▼함께 보면 좋은 글▼▼▼
짚신도 제짝이 있지.
댓글