본문 바로가기

VBA 범위 선택하기 6탄! Areas를 사용한 범위 선택!!

택이형. 2022. 12. 20.

 

UsedRange, CurrentRegion이 연속적인 범위를 설정하는 방법으로 주로 사용되었다면, Areas의 경우는 비연속적인 범위를 설정하는 방법으로 사용됩니다. VBA반복문과 궁합이 잘맞기 때문에 학습해 두시면 멋진 VBA코드를 작성하실 수 있는 기틀이 될거에요.

 

 

Areas를 사용한 범위 선택하기

 

 

 

벌써 VBA범위 선택하기의 마지막 단계인데요. 범위설정에 대한 감을 좀 잡으셨는지 궁금하네요. 만약 아직 VBA에 익숙해지지 않으셨다면 과거 포스팅을 통해서 차근차근 따라오시는 걸 추천드립니다. 우리가 왜 VBA를 배우려고 결심했는지를 다시한번 생각해보면서 VBA 6탄인 areas 범위에 대해 학습해 보도록 할게요.

 

엑셀 VBA를 왜 배워야 할까? 업무 자동화 시작해 보세요!

안녕하세요. 택이형과 회사에서 생존하기 택이형입니다. 오늘은 회사에서 엑셀 VBA로 생존하기를 주제로 포스팅을 해보려고 합니다. 우리가 VBA를 사용해야 하는 이유!! 여러분들은 VBA가 무엇인

lst914.tistory.com

 


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를 사용하여 선택된 범위들이 어떻게 출력되는지 살펴 볼게요.

 

MsgBox Selection.Address를 통해 선택한 범위 출력
MsgBox Selection.Address를 통해 선택한 범위 출력

 

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를 사용하여 다중범위를 설정 후 데이터 행간격을 유지하기 위해 행을 삭제하는 코드를 작성해 볼게요.

예시는 아래와 같아요.

 

aresas를 사용한 코드 예시
aresas를 사용한 코드 예시

 

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의 사용방법이 궁금하시다면?

 

VBA 범위 선택하기 2탄 (Cells, Offset, Resize 조합)

안녕하세요. 택이형과 회사에서 VBA로 생존하기 택이형입니다. 오늘은 VBA 범위 선택하기 2탄 Cells, Offset, Resize속성을 가지고 범위를 지정해 보도록 할게요. 우선 Range로 범위 설정하기에 대한 학습

lst914.tistory.com

 

또한 EntireRow.Delete를 사용하여 행 전체를 삭제하여 데이터셋의 행간격을 1칸으로 유지하도록 하여 다음과 같은

결과를 얻었습니다.

 

areas 다중범위를 사용한 매크로 결과
areas 다중범위를 사용한 매크로 결과

 

 

마치며

지금까지 areas를 사용하여 범위를 선택하는 방법에 대해 알아보았는데요. VBA의 경우에는 스스로 코드를 짜보는 것이 굉장히 중요해요. 어려운 부분에 봉착하였다 하더라도 포기만 하지 않는다면 적어도 본인의 업무자동화는 만들어 내실 수 있어요. 끝까지 포기하지 말고 하나씩 천천히 해결해 나가도록 해봐요!

 

 

▼▼▼함께 보면 좋은 정보▼▼▼

 

VBA 범위 선택하기 5탄 (UsedRange, CurrentRegion, entirerow)

『 UsedRange, CurrentRegion, entirerow는 연속된 범위를 설정하는 방법으로 유용하게 사용될 수 있어요. 다양한 예시를 통해 학습하시면 VBA실력이 한단계 업그레이드 될거에요. 』 오늘은 VBA 범위 선택

lst914.tistory.com

 

 

VBA 범위 선택하기 4탄 (Specialcells 사용법)

『 Specialcells는 엑셀 VBA에서 약방의 감초같은 역할을 하는데요. 다양한 옵션을 사용할 수 있기때문에 범위선택을 위한 유용한 역할을 하고 있어요. 빈셀이나 수식이 입력된 셀 등 특수한 상황에

lst914.tistory.com

 

 

VBA 범위 선택하기 3탄 (Union, Intersect 사용법)

『 Union, Intersect를 활용하면 교집합과 합집합의 범위를 한번에 설정할 수 있어요. 특히 Union의 경우는 앞으로 변수들을 합치는 방법으로도 사용될 예정이니 꼭 완벽숙지하시기 바래요! 』 오늘을

lst914.tistory.com

 

 

VBA 범위 선택하기 2탄 (Cells, Offset, Resize 조합)

『 Cells, Offset, Resize를 활용하여 엑셀의 범위를 자유자재로 선택할 수 있어요. 각 속성이 가지는 특징과 예시를 통해 범위선택이 자연스럽게 익혀지도록 연습해 보세요. 』 오늘은 VBA 범위 선택

lst914.tistory.com

 

 

VBA 범위 선택하기 1탄 (Range)

『 VBA를 본격적으로 활용하기 위해서는 적용하고자하는 범위를 선택하는 방법을 알아야 하는데요. VBA에서 자주 사용되는 6가지의 범위선택법을 학습하여 VBA의 기초를 다져볼게요! 』 앞서 VBA를

lst914.tistory.com

 

 

노력은 나를 배신하지 않는다.

댓글