• 최초 작성일: 2004-12-10
  • 최종 수정일: 2022-07-10
  • 조회수: 108,494 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: 레인지 개체 생성 (3) ㅡ CurrentRegion, UsedRange 속성

엑셀러 권현욱

들어가기 전에

전설적인 골퍼 잭 니클라우스는 이런 말을 했습니다.

"나는 골프 시합을 할 때마다 항상 머릿속에다 정확한 그림을 그린다. 그리고 나는 공이 멈춰야 할 지점을 바라다 본 후 그곳으로 날아갈 공의 탄도와 착지점을 바라본다. 그 다음에야 나는 내가 그린 이미지를 실제 상황으로 바꾸어 줄 스윙을 할 수 있다."

자신이 원하는 것(혹은 되고자 하는 사람)이 있다면 이미 그것을 가지고 있거나 되어 있다고 상상한 후 그런 자신이 어떻게 느끼고 있는지 현실처럼 또렷이 상상해 보는 것이 중요하다고 합니다.

벌써 12월 중순입니다. 올 한해 마무리도 물론 중요합니다만 내년도 계획을 세워야 할 시기입니다. 내년 연말에 자신이 이루고자 하는 것이 무엇인지 목표를 정한 다음 그것을 이미 이루었다고 상상해 보는 훈련을 시작할 때 입니다. 늘 이루지 못한 것에 대해 후회할 것이 아니라...



엑셀에는 여러 가지 오브젝트가 있고 무엇 하나 안 중요한 것이 없습니다만, 프로그래밍 할 때 가장 활용도 높은 오브젝트는 지지난 강의부터 배우고 있는 Range 오브젝트입니다. 이번 시간에는 Range 오브젝트를 생성하는 방법 중 CurrentRegion과 UsedRange 속성에 대해 알아보겠습니다.

CurrentRegion 속성

CurrentRegion이란 '셀 포인터가 놓여 있는 위치를 중심으로 하여 빈 행과 빈 열로 둘러싸인 영역'을 말합니다. 좀 다르게 표현하자면, '현재 선택된 셀을 중심으로 상하좌우 방향으로 인접해 있는 영역'을 의미합니다. 먼 소린가 하는 분들을 위해... 다음 그림을 보세요.

로드 중...

A1 셀의 CurrentRegion은?

셀 포인터가 A1 셀에 위치하고 있습니다. 이 경우 CurrentRegion, 즉 현재 영역은 어디가 될까요? 위쪽과 왼쪽으로는 더 이상 갈 곳이 없고, 오른쪽과 아래쪽 방향으로 빈 행과 빈 열이 나올 때까지 주욱 따라가 보면 G열 그리고 8행을 만나게 됩니다. 따라서 A1 셀의 CurrentRegion은 빈 행/열을 만나기 바로 전까지 영역인 A1:F7 영역이 됩니다.

로드 중...

A1 셀의 CurrentRegion은 A1:F7

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

Sub CurrentRegion_Property()
    Range("A1").CurrentRegion.Select
End Sub

CODE

Range("A1") 부분을 적당한 셀로 지정하면 됩니다. 그냥 현재 영역만 덜렁 선택하는 예제는 별로 재미가 없으니까 현재 영역의 외곽에 실선을 그려보면 재미가 있을까요? A1 셀의 현재 영역(B3:E7)에 괘선을 그리려면 다음과 같이 표현합니다.

Sub CurrentRegion_Property2()
    Range("A1").CurrentRegion.BorderAround Weight:=xlMedium
End Sub

CODE

지정한 범위에 테두리선을 그릴 때에는 BorderAround 메서드를 사용하고 선의 굵기는 Weight 인수를 통해 지정합니다. 이 시점에서 이런 탄식이 어디선가 들려오는 듯 합니다.

'아, 이런 것을 어떻게 다 외워서 사용한단 말인가...'

절대로 머리 싸매고 외울 필요가 없습니다. 그것은 일부 천재들이나 할 법한 짓(?)이랍니다. 우리는 매크로 기록기를 사용하여 괘선을 그리는 과정을 기록한 다음, 작성된 코드를 보고 '아, 이런 경우에는 이런 메서드나 속성을 기록하는 군! 그러니까 이 부분을 이렇게, 저 부분을 저렇게 고치기만 하면 되겠네?' 하고 느끼기만 하면 됩니다.

현재 영역에 괘선을 그리는 것도 하고나서 보니 별로 재미가 없군요. 그렇다면 응용력을 조금 발휘해서, 표의 제목 부분을 제외한 영역에만 색상을 지정하는 것을 만들어 볼까요? 그렇게 하려면 CurrentRegion 속성 외에도 Offset, Resize 속성 등을 조합해서 사용해야 합니다. 다음 코드를 잘 보세요. 이해가 안 되는 부분이 있더라도 스트레스 받지 말고 논리적으로 이해만 하고 넘어가도 됩니다. 앞으로 계속 반복될 거니까요.

Sub CurrentRegion_Property3()
    Range("A1").CurrentRegion.Select
    MsgBox "현재 영역을 선택하였습니다"

    Selection.Offset(1,0).Select
    MsgBox "현재 영역 중에서 타이틀 부분을 제외하였습니다"

    Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count).Select
    MsgBox "이제 색칠을 합니다"
    Selection.Interior.ColorIndex = 44
End Sub

CODE

위 코드를 실행하면 그림과 같은 결과가 나타납니다. 한결 재미있지요? (^^)

로드 중...

Rows 속성

UsedRange 속성

CurrentRegion 속성을 사용하면 특정한 셀에 인접해 있는 영역에 접근할 수는 있습니다만 떨어져 있는 영역에는 접근할 수 없습니다. 다음과 같이 떨어져 있는 영역을 포함하여 '워크시트 중에서 사용된 모든 영역'을 선택하려면 UsedRange 속성을 사용하면 됩니다.

로드 중...

Rows 속성

여기서 한 가지 유의할 점! CurrentRegion 속성은 Range 오브젝트의 똘마니(?) 속성인데 비해, UsedRange 속성은 Worksheet 오브젝트에 딸린 속성이라는 점에 주의하시기 바랍니다. 즉, Range("A1:E100").Select 와 같은 형태로는 사용할 수 없다는 얘기입니다.

Sub UsedRange_Property()
    ActiveSheet.UsedRange.Select
    MsgBox "현재 시트의 UsedRange는 " & Selection.Address & "입니다."
End Sub

CODE

앞에서 소개한 코드들은 작업의 진행 상황을 시각적으로 보여드리기 위해 불필요한 구문들이 다소 들어 있습니다. 기본적인 원리를 파악한 다음에는 불필요한 부분을 제거하여 코드를 최적화 하세요. 실제 프로그래밍에서 이렇게 하면 뜻하지 않게 장수하게 되는 일이 생길 수 있습니다(욕을 다량으로 섭취...).

다음 시간에 또...