-
Excel 매크로 (VBA) - 006. 셀 병합 하기Excel/Excel 매크로 2022. 8. 18. 22:27728x90
전체 목차
- 001. 특정 행을 복사하여 삽입하기
- 002. 선택하여 붙여 넣기 기능 정리
- 003. 변수/Assignment/Loop/비교
- 004. 데이터가 있는 셀의 범위 알아내기
- 005. 데이터 시트(쉘) 순회하기
- 006. 셀 병합 하기
포스트 목차
- 01. 해결해야 하는 문제
- 02. 엑셀에서의 셀 병합
- 03. VBA에서의 셀 병합
- 04. 문제 해결을 위한 도구들
-05. 매크로 작성 및 실행
데이터를 정리하다보면, 셀이 병합된 데이터를 처리해야 하는 경우가 있다. 본 포스트에서는 VBA를 통해 셀을 병합하는 방법을 익히고, 병합과 관련된 몇몇 기능들을 다루려고 한다.
01. 해결해야 하는 문제
- 셀 병합
- 병합 된 셀에 대한 정보 추출
- 셀 복원본 포스트에서는 두 개의 Sub 프로시저를 만든다.
1) 셀을 병합 하는 Sub 프로시저
아래 그림의 데이터가 주어졌을 때, A1:A3 과 C4:C6를 병합하는 작업을 한다.
주어진 데이터 일부 셀이 병합된 데이터 2) 셀 병합에 관련된 여러 속성들을 알아보는 Sub 프로시저
아래 그림과 같이 여러 작업을 수행한다.
- (D1:F6): A1~C6까지의 셀이 병합된 셀인 경우, TRUE를 표기
- (G1:I6): A1~C6까지의 셀이 병합된 셀인 경우, 병합된 셀의 범위 를 표기
- (J1:L6): A1~C6까지의 셀에 저장된 값을 표기
- (M1:O6): A1~C6까지의 셀에 저장된 값을 표기한다. 병합된 셀의 경우 대표셀(좌측상단)에 저장된 값을 병합된 모든셀의 값으로 복사하여 병합 전으로 셀을 복원한다. (병합된 셀에는 같은 데이터가 들어간다고 가정해보자)
여러가지 작업을 수행한 결과
02. 엑셀에서의 셀 병합
영역 선택 후,
- 홈의 맞춤에서 병합하고 가운데 맞춤을 클릭
- 또는 우클릭 > 맞춤탭 > 텍스트 조정 > 셀 병합
셀 병합의 특징
- 가장 첫 셀 (영역 기준으로 왼쪽, 상단)의 데이터만 남기고 다른 셀에 있는 데이터는 없어진다.
03. VBA에서의 셀 병합
Range 객체의 Merge 매소드 이용
- 사용법 Range객체 . Merge
생략가능한 파라미터로 Across (Boolean형태 이며 기본 값은 False)을 갖는다.
- 사용 예)1234Sub MergeOptionTest()ActiveSheet.Range("A16:D25").Merge (True)ActiveSheet.Range("A27:D36").Merge (False)End Subcs A16:D25까지의 영역을 Across 옵션이 True인 상태로 병합한다.
A27:D36까지의 영역을 Across 옵션이 False인 상태로 병합한다.
매크로 실행 전 매크로 실행 후 Across 옵션은 필수값이 아니며, 지정하지 않은 경우 False로 간주한다. Across 옵션이 True로 셋팅된 경우, 열에 대해서만 셀병합을 시도한다. 위 그림에서 A열에서 D열까지 행 단위로 병합이 된 것을 확인할 수 있다. 반면에 Across 옵션이 False로 셋팅된 경우 영역 전체에 대한 병합을 한다는 것을 알 수 있다.
04. 문제해결을 위한 도구
- Range를 저장하기 위한 변수 선언 및 값 저장
Range 객체를 가르키는 변수를 생성하는 것이 가능하다. (객체에 대해서는 추후에 따로 포스팅을 할 예정이다.)
Range 객체에 대한 선언은 다음과 같이 수행 할 수 있다.
Dim 변수명 As Range
선언한 Range 객체 변수에 실제 엑셀의 Range 객체를 연동하는 작업은 키워드 Set을 통해 수행할 수 있다.
Set 변수명 = Range객체
Dim을 통해 해당 변수명을 Range 객체를 지칭하는데 사용하겠다는 것을 선언하고, Set을 통해 어떤 Range 객체를 지칭하는 지를 결정한다고 볼 수 있다.
Set을 통해 변수명에 Range 객체를 연동하면 변수명을 이용하여 특정 Range 객체에 접근하는것이 가능하다.
- For Each ... In ... Next 구문
예전 포스트에서 Loop(순환문)을 다루면서 For Each ... In ... Next 구분에 대해서는 예를 제시하지 않았는데 이번 포스트에서 다루려고 한다.
For Each 문은 여러 아이템의 집합으로 구성된어 있는 객체에 대해 각각의 개별 아이템을 하나씩 순회할 수 있게 해준다.
앞에서 설명한 Range 객체를 예로 들면, Range는 결국 하나 또는 그 이상의 Cell의 모임이라고 할 수 있는다. For Each 문을 사용하면 Range 를 구성하는 모든 Cell을 순회하면 특정 작업을 할 수 있게 된다.
사용 예)
123456789Dim rng As RangeSet rng = ActiveSheet.Range("A1:C6")For Each Item In rng.Cells...(Something)....Next Itemcs rng라는 이름의 Range 객체를 지시하는 변수를 선언하고, 활성화된 시트의 A1:C6 사이의 영역을 연동한다.
rng.Cells는 Range에 속하는 Cells들을 모임 형태로 반환하며, Item 이라는 변수로 각각의 Cell을 순서대로 접근하는 것이 가능하다.
- Range.MergeCells
Range객체의 병합셀이 포함되어 있는지를 나타낸다. True 또는 False 값을 갖는다.
- Range.MergeArea.Address
Range 객체에서 병합된 영역의 주소를 나타낸다. 영역이 범위에 대해 절대 주소로 나타낸다.
- Range(...).Cells(n,m)
Range 객체에서 최좌상단 셀을 Cells(1,1)로 설정한 후, n행 , m열 셀을 가져온다.
05. 매크로 작성 및 실행
123456789101112131415161718192021222324252627282930313233'두개의 영역 (A1:A3), (C4:C6)을 병합 하는 Sub 프로시저Sub MergeTest()ActiveSheet.Range("A1:A3").MergeActiveSheet.Range("C4:C6").MergeEnd Sub'특정 영역의 병합 관련 상태 정보를 조회하는 Sub 프로시저Sub isaMergedCell()'rng 라는 이름의 Range 객체를 지시하는 변수 선언Dim rng As Range'rng 변수에 현재 셀의 A1:C6의 Range 연동Set rng = ActiveSheet.Range("A1:C6")'A1:C6에 포함된 Cell 하나 하나에 Item 이란 변수명으로 순회For Each Item In rng.Cells'순회 하는 셀이 병합된 상태인 경우If Item.MergeCells Then'3열 오른쪽에 True 표기Cells(Item.Row, Item.Column + 3).Value = True'6열 오른쪽에 병합된 영역의 주소 표기Cells(Item.Row, Item.Column + 6).Value = Item.MergeArea.Address'12열 오른쪽에 병합된 영역의 첫번째 셀의 값 넣기Cells(Item.Row, Item.Column + 12).Value = ActiveSheet.Range(Item.MergeArea.Address).Cells(1, 1)'순회 하는 셀이 병합된 상태가 아닌 경우Else'3열 오른쪽에 False 표기Cells(Item.Row, Item.Column + 3).Value = False'12열 오른쪽에 현재 셀의 값 넣기Cells(Item.Row, Item.Column + 12).Value = Cells(Item.Row, Item.Column).ValueEnd If'9열 오른쪽에 현재 셀의 값 넣기Cells(Item.Row, Item.Column + 9).Value = Item.ValueNext ItemEnd Subcs 04에서 다룬 여러 속성값을 이용하여, 01에서 정의한 문제를 해결 할 수 있다. 위의 MergeTest Sub 프로시저와 isaMergedCell Sub 프로시저를 순서대로 실행하면 다음과 같은 결과를 얻을 수 있다.
매크로 실행 결과 728x90'Excel > Excel 매크로' 카테고리의 다른 글
Excel 매크로 (VBA) - 008. 정렬하기 (Sort) (0) 2022.08.24 Excel 매크로 (VBA) - 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능) (0) 2022.08.21 Excel 매크로 (VBA) - 005. 시트에 있는 데이터(셀) 순회하기 (0) 2022.08.17 Excel 매크로 (VBA) - 004. 데이터가 있는 셀의 범위 알아내기 (0) 2022.08.16 엑셀 매크로 (VBA) - 003. variable/assignment/branch/loop (변수/할당/비교/순환) (0) 2022.08.15