회사 생존기/엑셀 VBA로 생존하기

VBA로 셀병합 해제 후 빈셀 채우기(빈셀 채우기와 찰떡궁합!)

택이형. 2023. 1. 17.

 

병합되어 있는 표는 피벗테이블을 사용할 때 오류 발생이 높은 형태로 알려져 있습니다. 오류를 최소화하기 위해서는 셀병합은 되도록이면 사용하지 않는 습관을 들이는 것이 가장 좋을 것입니다. 그럼에도 병합을 꼭 해야 하는 상황이 발생할 수도 있는데요. VBA를 통해 셀병합을 해제하고 빈셀을 채워 넣는 프로시저를 작성해 보도록 하겠습니다.

 

 

셀병합 해제 후 빈셀채우기

 

 

VBA로 셀병합 해제 후 빈셀 채우기

엑셀 빈칸을 VBA로 채우는 방법에 대해 알아보았는데요. 만약 셀병합이 되어 있다면 기존 방법으로는 해결이 불가하게 될 거예요. 그럼 어떤 방법을 사용해야 할까요? 먼저 셀병합을 해제한 후 빈셀을 채우는 형태로 진행해야 할 텐데요.

예시를 한번 보시죠.

 

셀병합 해제방법
셀병합 해제방법

 

먼저 병합되어 있는 셀을 해제해야 할 텐데요. 간단하게 병합된 셀범위를 선택하신 후 『병합하고 가운데 맞춤』을 눌러주시면 병합이 해제되는 걸 보실 수 있습니다.

 

 

이동옵션을 통해 빈셀 채우기
이동옵션을 통해 빈셀 채우기

 

여기까지는 앞에서 배웠던 빈셀 채우기와 동일합니다. VBA를 통해서 반영하는 방법도 배웠었죠.

VBA를 사용한 빈셀 채우기는 아래 링크에서 확인해 주세요!

 

 

VBA 빈셀 채우기!(피벗테이블 오류 최소화 방법)

『 피벗테이블을 사용할 때 가장 주의하여야 할 점은 셀병합으로 인해 숫자가 누락되는 것입니다. 또한 합계가 되는 기준셀의 명칭이 없게 되면 우리가 원하는 값에 도달할 수 없다는 것이죠.

lst914.tistory.com

 

그럼 이제 본격적으로 병합해제 후 빈셀을 채우는 매크로를 작성해 볼까요?

 

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을 하면서 외부 테두리가 사라지는 경우를 대비하여 외곽선을 넣어주는 코드이니 참고하시고 스킵해 주시면 됩니다.

 


마치며

지금까지 셀병합 해제 후 빈셀채우는 방법을 매크로를 통해 구현해 보았는데요. 아무래도 구두로 설명을 드리려다 보니 쉽게 설명하지 못한 부분이 있는 것 같네요. 코드를 통해 연습을 해보시고 잘 안 풀리는 부분이 있다면 언제든 댓글로 문의를 남겨주세요. 확인하는 대로 코드를 수정하여 답글 남겨드리도록 하겠습니다.

 

▼▼▼함께 보면 좋은 글▼▼▼

 

VBA로 로우 데이터 정렬하기(1개의 기준으로 정렬, 2개이상의 기준으로 정렬)

『 엑셀작업을 할 때 가장 많이 시간이 소용되는 것은 데이터를 원하는 형태로 정리하는 것인데요. 주로 엑셀의 정렬기능을 이용하여 데이터를 가공하곤 합니다. 하지만 매번 바뀌는 로우데이

lst914.tistory.com

 

 

VBA로 엑셀 데이터 필터기능 적용하기!

『 수많은 raw데이터 중에서 내가 원하는 부분만 걸러서 보기 위해서 엑셀의 필터기능을 많이 사용하고 계십니다. 필터기능 역시 VBA를 통해 구현이 가능한데요. 원하는 기준으로 필터 적용 후 필

lst914.tistory.com

 

 

VBA 빈셀 채우기!(피벗테이블 오류 최소화 방법)

『 피벗테이블을 사용할 때 가장 주의하여야 할 점은 셀병합으로 인해 숫자가 누락되는 것입니다. 또한 합계가 되는 기준셀의 명칭이 없게 되면 우리가 원하는 값에 도달할 수 없다는 것이죠.

lst914.tistory.com

 

 

VBA 반복문 1탄(for~next 사용하기)

『 오늘은 VBA 반복문에 대해 알아보려고 하는데요. 반복문은 반복적인 작업을 대신해주는 만능키라고 할 수 있어요. 반복문은 지정한 횟수만큼, 혹은 무한으로 사용된 코드를 반복하게 만들어

lst914.tistory.com

 

 

짚신도 제짝이 있지.

댓글