Daily Life of BlueRose

컴퓨터 & 코딩 공부/엑셀 & VBA

엑셀 셀 합치기 일괄 적용 및 해제 방법(VBA 활용)

푸른로즈 2024. 6. 5. 17:04
728x90

여는 글

엑셀에서 가장 아쉬운 기능 중 하나는 동일한 내용의 셀에 대해 묶어주고, 풀어주는 기능이 없다는 점입니다. 물론 엑셀을 데이터 처리용으로 사용한다면 한 줄마다 각각 데이터가 있어야 하는게 맞지만, 우리의 회사는 그렇게 호락호락하지 않습니다... 동일한 사람에 대해 여러 개의 데이터가 있다면 왜 이렇게 보기 어렵게 해놨냐고 당장 과장님께 불려가서 잔소리를 듣게 될 수도 있습니다.
 
때문에, 보고서를 보는 분들께서 보기 편하도록 같은 값끼리 묶는 경우가 생각보다 많아서 자주 사용하게 됩니다. 그런데, 이러한 셀합치기를 매번 일일이 손으로 하기는 굉장히 힘들죠.
 
하지만 이러한 기능을 코드로 작성하여, 개인용 매크로 통합 문서에 저장해두면 필요할 때마다 범위를 선택하고 매크로만 작동시키면 되서 상당히 편해집니다.
 
이번 포스팅에서는 아래와 같이 셀합치기와 해제를 클릭 한 번으로 수행할 수 있도록 코드를 안내드리겠습니다.
 

셀합치기 일괄 적용 및 해제 예시(고객 이름별로 묶고 풀기)


셀합치기 일괄적용 코드

작동원리

셀을 합치는 코드의 구조를 핵심만 설명드리면 아래와 같습니다.

  • 단 한 줄만 선택한 상태에서 프로시저를 수행하도록 경고창을 띄운다.
  • 선택된 줄을 순회하면서 아래 동작을 수행한다.
    • 직전 셀과 현재 셀의 내용이 동일하다면, temp라는 변수에 범위를 담아둔다.
    • 더 이상 내용이 같은 셀이 이어지지 않거나 선택범위 마지막 셀에 도달시, temp에 담긴 범위에 셀 합치기를 적용한다.

 
 

VBV 코드

Sub 공통_Merge일괄적용()

Dim rng
Dim c
Dim i As Long
Dim temp As Range

If Selection.Columns.Count > 1 Then
    MsgBox "한 열만 선택해야 작동 가능"
    Exit Sub
End If

i = 1

Application.DisplayAlerts = False

For Each c In Selection				'현재 선택된 범위를 순회한다.
    If Not i = 1 Then					'단 한 칸만 선택하면 작동하지 않는다
        If c.MergeCells = False Then			'이미 셀이 합쳐진 상태라면 작동하지 않는다.
            If c.Value = c.Offset(-1).Value Then		'같은 값이 나오는 셀을 Range변수 temp에 축적한다.
                If temp Is Nothing Then			
                    Set temp = Union(c, c.Offset(-1))
                    Else: Set temp = Union(temp, c)
                End If
                If i = Selection.Rows.Count Then		'마지막 줄일 경우에는 셀합치기 처리 후 종료
                    If temp Is Nothing Then		'단, 변수 temp에 누적된 셀이 없다면 아무것도 안함
                    Else:				'temp가 비어있지 않다면 아래 동작 실행
                        temp.Merge				'temp 범위에 대해 셀합치기 실행
                        Set temp = Nothing			'temp 내부를 비워준다
                    End If
                End If
            Else:					'상단 셀과 내용이 다르다면 직전까지의 temp를 셀합치기
                If temp Is Nothing Then			
                Else:					'temp가 비어있지 않다면 아래 동작 실행
                    temp.Merge					'temp 범위에 대해 셀합치기 실행
                    Set temp = Nothing				'temp 내부를 비워준다
                End If
            End If
        End If
    End If
    i = i + 1
Next

Application.DisplayAlerts = True

End Sub

 
 

셀합치기 일괄해제 코드

작동원리

셀합치기를 분리하는 코드 구조를 핵심만 설명드리면 아래와 같습니다.
 

  • 선택된 줄을 순회한다.
  • 순회중인 셀이 셀합치기 상태인지 확인 후, 합치기 상태인 셀에 아래 동작을 수행한다.
    • 합쳐진 범위를 임시로 변수에 담아둔다.
    • 합쳐진 셀의 ‘셀합치기’를 해제한다.
    • 기존의 합쳐져 있던 범위에 대하여 자동채우기 핸들로 동일한 내용을 복사해준다.

 
 

VBA 코드

Sub 공통_Merge일괄해제()

Dim rng
Dim c
Dim temp
Dim temp_c

If Selection.Columns.Count > 1 Then		
    MsgBox "한 열만 선택해야 작동 가능"
    Exit Sub
End If

For Each c In Selection			'현재 선택된 범위를 순회한다.
    If c.MergeCells = True Then			'순회중인 셀이 ‘셀합치기’상태라면 아래 동작을 수행한다.
        Set temp = c.MergeArea				'합쳐진 셀의 범위를 임시변수에 담는다.
        c.UnMerge					'‘셀합치기’를 해제한다.
        temp.FillDown					'합쳐져있던 영역을 채우기 핸들로 동일하게 채워준다.
    End If
Next
    
End Sub

 
 

개인용 매크로 통합 문서 저장방법

코드 사용시마다 공통적으로 요구되는 부분이라 별도의 포스트로 작성해두었습니다. 아래 문서를 참고해주세요.
2024.05.29 - [컴퓨터 & 코딩 공부/엑셀 & VBA] - VBA 매크로를 문서마다 재활용하는 방법(Personal 파일 활용)

VBA 매크로를 문서마다 재활용하는 방법(Personal 파일 활용)

여는글엑셀을 활용하여 매크로를 만들다보니, 문득 공통적으로 사용하는 매크로를 어딘가에 등록해놓고 그때그때 버튼만 눌러서 활용할 수 없을까 라는 생각이었습니다. VBA에는 이러한 상황에

bluestella.tistory.com

 
 

반응형