Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 08강. 레인지 개체(3) ㅡ 사용된 영역에 접근하기

권현욱(엑셀러) 2023. 10. 1. 08:00
반응형

들어가며

엑셀에는 여러 가지 개체가 있고 어느 것 하나 안 중요한 것이 없습니다만, 가장 활용도 높은 개체는 지지난 시간부터 배우고 있는 레인지 개체입니다. 이번에는 워크시트에서 사용된 범위에 접근하는 방법에 대해 알아봅니다. 이번 강의를 마칠 무렵이면 자신이 얼마나 발전해 있을지 기대하면서... 출발합시다.


CurrentRegion 속성

CurrentRegion은 Current(현재) + Region(영역) 이렇게 나눠볼 수 있습니다. '셀 포인터가 놓여 있는 위치를 중심으로, 빈 행과 빈 열로 둘러싸인 영역'을 말합니다. 좀 다르게 표현하면, '현재 선택된 셀을 중심으로 상하좌우 방향으로 인접해 있는 영역'이라고 할 수 있으며 '현재 영역'이라고 번역합니다. 다음 그림을 보세요.

(이미지: 아이엑셀러 닷컴)

셀 포인터가 C4 셀에 있습니다. 이때 CurrentRegion, 즉 현재 영역은 어디가 될까요? 쉽게 파악할 수 있는 방법이 있습니다. 이 상태에서 CTRL + A 키를 눌러보세요.

(이미지: 아이엑셀러 닷컴) C4 셀의 CurrentRegion은 B2:H21

특정 셀의 현재 영역에 접근하려면 CurrentRegion 속성을 사용하면 됩니다. 다음 코드를 실행하면 C4 셀의 현재 영역을 선택합니다.

Sub currentRegion_1()
    Range("C4").currentRegion.Select
End Sub

현재 영역만 덜렁 선택하는 예제는 별로 재미가 없으니까 현재 영역에 괘선을 그려보면 어떨까요? 

Sub currentRegion_2()
    Range("C4").currentRegion.Borders.LineStyle = xlSolid
End Sub

CurrentRegion 속성의, Border 속성의, LineStyle 속성을 xlSolid(실선)로 지정합니다. '속성에 속성을 사용할 수 있나요?'라는 질문에 대한 답변은 Range 속성을 다룰 때 이렇게 답변한 적이 있습니다.

...Range("A1")이라고 하는 순간 레인지 개체가 만들어지고, 여기에(즉, 레인지 개체에) Value 속성을 사용한 형태...

Range 개체와 마찬가지로, CurrentRegion, Borders 등을 사용하는 순간 해당 개체가 만들어지고, 그 개체에 속성을 지정하는 형태입니다.


UsedRange 속성

UsedRange는 Used + Range니까 '사용된 영역'쯤 되겠군요. CurrentRegion을 사용하면 특정한 셀에 인접해 있는 영역에 접근할 수는 있지만 떨어져 있는 영역에는 접근할 수 없습니다. '워크시트에서 사용된 모든 영역'을 선택하려면 UsedRange 속성을 사용합니다.

Sub usedRange()
    ActiveSheet.usedRange.Select
End Sub

위 코드를 실행한 결과 화면입니다.

(이미지: 아이엑셀러 닷컴)

CurrentRegion은 Range 개체의 똘마니(?) 속성인데 비해, UsedRange 속성은 Worksheet 개체에 딸린 속성이라는 점에 유의하시기 바랍니다. 따라서 'Range("A1:E100").UsedRange.Select' 이런 형태로는 사용할 수 없습니다. 반드시 앞에 시트가 와야 합니다.


Union 메서드

학창 시절에 수학 중에서 '집합'은 다들 열심히 공부했습니다. 집합에는 합집합, 교집합, 부분집합, 차집합, 여집합, 공집합, 유한집합, 무한집합 등이 있다고 기억하고 있을 겁니다. 많기도 하죠?

Union 메서드는 이 중에서 합집합과 비슷한 개념입니다. 다음과 같은 데이터에서 합집합에 해당하는 영역은 어디일까요?

(이미지: 아이엑셀러 닷컴) 합집합에 해당하는 영역은?

다음 코드를 실행시켜 보면 결과를 알 수 있습니다. 변수를 선언하고, 변수에 값을 지정하는 부분이 길어서 그렇지 핵심적인 부분은 얼마 되지 않습니다. 물론 우리는 아직 변수에 대해서는 배우지 않았습니다만, 눈치로 파악할 수 있는 수준의 코드입니다.

Sub unionMethod()
    ''' 변수 선언
    Dim wsData As Worksheet
    Dim rFirst As Range
    Dim rSecond As Range
    Dim rUnion As Range

    ''' 변수에 값 지정
    Set wsData = ActiveSheet
    Set rFirst = wsData.Range("B2").currentRegion
    Set rSecond = wsData.Range("J9").currentRegion
    Set rUnion = Application.Union(rFirst, rSecond)    ''' 여기가 핵심
    
    rUnion.Select
End Sub

결과는 크게 어려움 없이 대답할 수 있을 겁니다. B2:H21, 그리고 J9:M13 영역입니다.

(이미지: 아이엑셀러 닷컴: Union 메서드 실행 결과

여기까지 배운 것만 가지고도 여러 가지 일을 할 수 있습니다. 특정한 영역에 각종 서식을 지정하는 것도 그중 하나죠. 어떤 것들을 더 할 수 있을지 적극적으로 찾아보세요. 코딩 기술은 적극적인 적용의 과정을 통해 발전합니다.


Intersect 메서드

합집합과 대비되는 개념은 교집합입니다. Intersect 메서드를 사용하면 두 개 이상의 영역 중에서 서로 겹쳐지는 영역에 접근할 수 있습니다.

(이미지: 아이엑셀러 닷컴)

위 그림에서 두 영역이 겹쳐지는 영역(회색)에 접근하기 위한 코드입니다. 밑에서 두 번째 라인(여기가 핵심)만 눈여겨보시면 됩니다.

Sub intersectMethod()
    Dim rFirst As Range
    Dim rSecond As Range
    Dim rInter As Range
    Dim i As Integer

    Set rFirst = ActiveSheet.Range("A1:D8")
    Set rSecond = ActiveSheet.Range("C5:G12")
    Set rInter = Application.Intersect(rFirst, rSecond)   ''' 여기가 핵심
    rInter.Select
End Sub

Intersect는 나중에 '이벤트(Event)'를 다룰 때 유용하게 쓸 수 있습니다. 자세한 예제는 그때 다시 다루겠습니다.

코드가 이해되지 않는다고 너무 스트레스받지 마시기 바랍니다. 지금 단계에서는 전체적인 흐름과 구조를 익히는 것이 중요합니다.


나가며

앞에서 소개한 내용은 각자로서도 기능하지만 서로 조합하면 다양한 일들을 처리할 수 있습니다. 복잡한 미적분도 그 출발은 사칙연산에서 시작되듯 말이지요. 여기까지 따라오신 것만으로도 대단한 겁니다. 축하합니다.

반응형