VBA 범위 선택하기 6탄! Areas를 사용한 범위 선택!!
UsedRange, CurrentRegion이 연속적인 범위를 설정하는 방법으로 주로 사용되었다면, Areas의 경우는 비연속적인 범위를 설정하는 방법으로 사용됩니다. VBA반복문과 궁합이 잘맞기 때문에 학습해 두시면 멋진 VBA코드를 작성하실 수 있는 기틀이 될거에요.
벌써 VBA범위 선택하기의 마지막 단계인데요. 범위설정에 대한 감을 좀 잡으셨는지 궁금하네요. 만약 아직 VBA에 익숙해지지 않으셨다면 과거 포스팅을 통해서 차근차근 따라오시는 걸 추천드립니다. 우리가 왜 VBA를 배우려고 결심했는지를 다시한번 생각해보면서 VBA 6탄인 areas 범위에 대해 학습해 보도록 할게요.
VBA 범위 선택 목차
1. VBA 범위 선택하기 1탄 : Range로 범위 선택
2. VBA 범위 선택하기 2탄 : Cells와 Resize, Offset의 조합을 통한 범위 선택
3. VBA 범위 선택하기 3탄 : Union, Intersect을 사용한 범위 선택
4. VBA 범위 선택하기 4탄 : Special cells를 통한 범위 선택
5. VBA 범위 선택하기 5탄 : UsedRange, CurrentRegion, entirerow(column)을 통한 범위 선택
6. VBA 범위 선택하기 6탄 : Areas를 사용한 범위 선택
Areas는 어떻게 사용하나?
Areas는 비연속적으로 떨어진 다중범위를 선택할때 주로 사용되는데요. 기본문법은 기준개체.areas 입니다.
Areas를 사용하여 선택된 범위들이 어떻게 출력되는지 살펴 볼게요.
Sub areas1() '기본문법은 기준개체.areas MsgBox Selection.Address ' 선택된 셀의 주소를 절대참조로 출력. Address(0,0)으로 표현시 상대참조로 출력 MsgBox Selection.areas(1).Address(0, 0) MsgBox Selection.areas(2).Address(0, 0) MsgBox Selection.areas(3).Address(0, 0) MsgBox Selection.areas(4).Address(0, 0) ' 선택된 4개의 범위를 메시지박스를 통해 순차적으로 출력 End Sub |
먼저 1번 예시부터 살펴보면 MsgBox Selection.Address통해 선택한 셀을 메시지창으로 출력하였는데요.
여기서 Address를 Address(0,0)으로 변경하면 절대참조에서 상대참조로 변경되어 출력된다는 점만 참고해 주세요.
다음은 areas를 통해 선택된 다중범위들을 순차적으로 출력하는 코드를 알아볼게요.
사용된 코드를 돌려보면 areas(1), areas(2), areas(3), areas(4)가 선택된 순서대로 메시지박스에 출력되는 것을 볼 수 있는데요. 만약 내가 5개의 범위를 선택하였다면 areas(5)를 추가하여 5번째 범위를 출력할 수 있어요.
위와 같이 사용하여도 무방하지만 단점이 존재하는데요.
첫번째 단점은 우리가 몇개의 범위를 선택할지 알 수 없다는 점이고, 두번째 단점은 범위가 추가될때마다 코드를 수정해야한다는 점이에요. 이와같이 매번 수정을 해야 한다면 우리가 추구하는 업무자동화를 이룰 수 없겠죠.
이러한 문제는 반복문을 사용하여 해결할 수 있어요.
(물론 반복문과 동적변수의 경우에는 추후 자세히 다룰 예정이니, areas가 어떻게 사용되는지에 집중하여 학습해 주세요!)
Sub areas2() Dim a As Range Dim adr() Dim i As Long For Each a In Selection.areas ' 선택된 다중범위 하나하나를 a변수에 넣음. ReDim Preserve adr(i) ' 동적변수의 방개수를 재정의하기 위해 ReDim Preserve을 선언. adr(i) = a.Address(0, 0) ' a변수에 들어온 범위를 adr변수에 차례로 넣음. i = i + 1 ' adr변수의 갯수를 하나씩 늘려서 방의 갯수를 확정. Next MsgBox "선택한 다중범위는 " & vbcr & Join(adr, vbcr) ' join을 통해 4개의 범위를 메시지 박스 하나에 띄우되, vbcr를 통해 enter효과로 정렬. End Sub |
위의 코드는 선택된 다중범위 하나하나를 카운팅하여 순서대로 출력되도록 설정해 놓은 코드인데요.
위에서 areas(1)~areas(4)의 진행을 카운팅하고 변수에 담아내어 표현하고자 반복문을 사용하였어요.
선택된 범위가 증가할때마다 코드를 수정하지 않고도 반영되는 자동화 코드라고 이해하시면 좋을 것 같아요.
아직 미학습된 코드들이 많이 보이지만 자꾸 보시면 익숙해질 수 있으니 간략히 설명드리도록 할게요.
먼저 For Each 변수 in 범위 ~ Next 반복문이 사용되었는데요. 반복문을 사용하여 선택된(Selection) 다중범위(areas)의 범위 하나하나를 a 변수에 담았어요. 4개의 범위를 선택하였기에 a에는 4개의 범위가 하나씩 담겨있는 거죠.
ReDim Preserve adr(i)은 조금 복잡할 수 있는데요. adr()이 동적 변수로 적용되었기때문에 방이 갯수가 확정되지 않은
상태로 유지되게 되는데요. 이러한 방의 갯수를 확정시키기 위해 ReDim Preserve을 사용하여 갯수를 확정지었어요.
결국 Dim을 Redim으로 변수를 재선언하여 방의 갯수를 확정지은 것이죠. (정적 변수와 동적 변수의 설명은 추후에..)
adr(i)의 방에 a변수의 범위 주소를 하나씩 반복해서 넣기 위해 i = i + 1을 추가해 주었는데요.
adr(i)에는 총 4개의 변수가 담기게 되고 메시지박스에 출력되면서 프로시저가 종료하게 됩니다.
MsgBox "선택한 다중범위는 " & vbcr & Join(adr, vbcr)에서 vbcr은 줄바꿈을 위한 코드이며, join은 4개의 변수를 순차대로 출력하는 것이 아닌 한번에 합쳐서 출력되도록 사용되었어요.
지금까지 반복문을 통해서 선택된 범위가 몇개이던 상관없이 메시지박스로 출력하는 코드를 짜보았는데요.
지금은 간단한 코드에 불과하지만 이러한 것들이 쌓이게 되면 나의 퇴근시간을 줄여주는 강력한 무기가 될거에요.
활용 : Areas 다중범위를 통해 데이터 간 행간격 유지하기
이번엔 areas를 사용하여 다중범위를 설정 후 데이터 행간격을 유지하기 위해 행을 삭제하는 코드를 작성해 볼게요.
예시는 아래와 같아요.
Sub areas2() Dim rng As Range, a As Range Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp)) ' a1열부터 a열의 마지막 데이터가 있는 행까지의 범위를 선택 For Each a In rng.specialcells(xlCellTypeBlanks).areas ' areas 다중범위의 빈셀들을 a변수에 하나씩 담음. If a.Count > 1 Then ' a변수에 들어온 행의 숫자가 1보다 크면 a.Resize(a.Count - 1, 1).EntireRow.Delete ' 삭제할 범위를 재설정하여 전체행을 삭제 End If Next End Sub |
Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp))는 a열에 데이터가 있는 마지막 행까지의 범위를 선택하여
rng변수에 담아두는 코드에요. 변수를 사용하는 이유는 코드가 복잡해질경우 변경할 코드를 찾기 힘들며, 그로인해 발생할 수 있는 리스크를 최소화 시키기 위함이에요.(변수 설정시에는 변수 내용만 변경하면 정확한 작업이 가능.)
For Each a In rng.specialcells(xlCellTypeBlanks).areas는 반복문을 통해 선택된 다중범위를 a변수에 차례대로
넣었으며, IF문을 사용하여 a변수가 1보다 클 경우에는 Resize를 통해 범위를 재설정하였어요.
Resize의 사용방법이 궁금하시다면?
또한 EntireRow.Delete를 사용하여 행 전체를 삭제하여 데이터셋의 행간격을 1칸으로 유지하도록 하여 다음과 같은
결과를 얻었습니다.
마치며
지금까지 areas를 사용하여 범위를 선택하는 방법에 대해 알아보았는데요. VBA의 경우에는 스스로 코드를 짜보는 것이 굉장히 중요해요. 어려운 부분에 봉착하였다 하더라도 포기만 하지 않는다면 적어도 본인의 업무자동화는 만들어 내실 수 있어요. 끝까지 포기하지 말고 하나씩 천천히 해결해 나가도록 해봐요!
▼▼▼함께 보면 좋은 정보▼▼▼
노력은 나를 배신하지 않는다.
댓글