• 최초 작성일: 2023-08-07
  • 최종 수정일: 2023-08-07
  • 조회수: 1,936 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 레인지 개체 생성 (6) ㅡ Offset, Resize 속성

엑셀러 권현욱

들어가기 전에 ㅡ 민들레는 장미를 부러워하지 않는다

"뉴욕은 캘리포니아보다 3시간 빠르다. 하지만 그렇다고 캘리포니아에 비해 뒤처진 것은 아니다.
어떤 사람은 22세에 졸업을 했다. 하지만 좋은 일자리를 얻기 위해 5년을 기다렸다.
어떤 사람은 25세에 CEO가 되었다. 그리고 50세에 사망했다.
반면 또 어떤 사람은 50세에 CEO가 되었다. 그리고 90세까지 살았다.
어떤 사람은 미혼이다. 반면 어떤 사람은 결혼을 했다.
오바마는 55세에 은퇴를 했다. 그리고 트럼프는 70세에 시작했다.
세상의 모든 사람들은 자기 자신의 시간대에서 일한다.
당신 주위에 있는 사람들은 당신을 앞서가는 것처럼 느낄 수 있다.
어떤 사람들은 당신보다 뒤처진 것 같기도 하다.
하지만 우리 모두 자신의 경주를, 자기 자신의 시간대에 맞춰서 하고 있는 것뿐이다.
그런 사람들을 부러워하지도 말고, 놀라지도 말자.
그들은 자신의 시간대에 있을 뿐이고, 당신도 당신의 시간대에 있는 것뿐이다.
인생은 행동하기에 적하한 때를 기다리는 것이다. 그러니까 긴장을 풀어라.
당신은 뒤처지지 않았다. 이르지도 않다.
당신은 당신의 시간대에 잘 맞춰서 가고 있다."

ㅡ 레딧(Reddit)에 올라온 글

로딩 중...

(이미지 출처: unsplash.com)

이 글을 읽고 시간에 대해 생각해 보게 되었다. 작가 황대권의 말처럼, "민들레는 장미를 부러워하지 않"는다. 민들레뿐 아니라 다른 어떤 야생초들도 장미를 부러워하지 않"는다. 만물은 각자의 시간대가 있고, 그 리듬에 따라 살아갈 뿐이다.

우린 모두, 그리고 각자 저마다의 시간을 살아가고 있다.



강의에서는 수도 없이 언급되었는데, 정작 'VBA 기본과 활용' 강의 목록에는 포함되어 있지 않아서 별도 강의로 정리합니다. 충분히 그럴 가치가 있을 정도로 중요한 속성들입니다.

Offset 속성

엑셀 워크시트 함수 중에 Offset 함수가 있습니다. '기준 셀에서 지정한 위치 만큼 이동한 다음, 지정한 크기 만큼 참조 범위를 반환'해 주는 함수입니다. 자세한 설명은 다음 게시물을 참고하세요.

VBA의 Offset 속성은 이것과는 사용 방법이나 역할이 조금 다릅니다. '참조 셀(또는 영역)을 지정한 위치로 이동'시키고자 할 때 사용합니다. 사용 규칙은 이렇습니다.

Range 개체.Offset(행 방향 이동할 셀 수, 열 방향 이동할 셀 수)

다음 그림과 같이 A1 셀을 기준으로 행 방향으로 3행, 열 방향으로 4열 만큼 이동한 위치, 즉 E4 셀로 이동하려면 어떻게 표현할 수 있을까요?

로딩 중...

A1 셀에서 3행, 4열 이동

두 가지 방식으로 가능합니다.

  1. Range("A1").Offset(rowoffset:=3, columnoffset:=4).Select
  2. Range("A1").Offset(3, 4).Select

01은 인수의 이름을 붙인다고 하여 '명명된 인수Named arguments'라고 합니다. 매서드나 속성에서 사용되는 매개변수는 정해진 순서가 있는데, 이 방식을 사용하면 그 순서를 지키지 않아도 됩니다. 다음 두 줄은 같은 결과를 돌려줍니다(둘 다 E4 셀 선택).

Range("A1").Offset(rowoffset:=3, columnoffset:=4).Select
Range("A1").Offset(columnoffset:=4, rowoffset:=3).Select

02와 같은 방식은 '선택적 인수Optional arguments'라고 부릅니다. '선택적 인수'는 매개변수의 이름을 적지 않는 대신, 위치를 정해진 순서대로 일치시켜야 합니다. 만약 사용하지 않는 매개변수가 있다면 콤마라도 입력해서 매개변수가 들어가는 자리를 구분해야 합니다. Offset처럼 매개변수가 몇 개 안 되면 '선택적 인수', Sort 메서드처럼 매개변수가 많다면 '명명된 인수' 방식을 사용하면 편리합니다.

rowoffset이나 columnoffset 0이라면 생략할 수 있습니다.

Range("A1").Offset(4).Select → A5 셀 선택(columnoffset 생략)
Range("A1").Offset(, 3).Select → D1 셀 선택(rowoffset 생략)

Resize 속성

Resize 속성을 사용하면 선택된 셀 범위의 크기를 변경할 수 있습니다. 사용법은 간단합니다. 새로 변경할 행 수와 열 수를 지정해 주기만 하면 됩니다.

Range 개체.Resize(행 수, 열 수)

행 수와 열 수 인수는 직접 숫자값을 지정하거나(01), 이미 선택된 영역의 행 수나 열 수를 파악한 다음, 여기에 숫자를 더하거나 빼서 표현할 수도 있습니다(02).

  1. Selection.Resize(3, 5).Select
  2. Selection.Resize(Selection.Rows.Count + 2, Selection.Columns.Count + 2).Select

"그런데 이런 이상한 거는 배워서 어디에 써먹나요? 가뜩이나 날도 더운데..."

라며 궁시렁거리는(?) 분이 저어~기 두어 분 있군요.(ㅎㅎ) 그래서 준비했습니다.

활용 예

Offset과 Resize 속성은 따로 사용되기도 하지만 두 개가 세트로 쓰이는 경우가 많습니다. 아래 왼쪽과 같은 표를 오른쪽과 같이 팀명에는 색상을 지정한다고 생각해 보죠.

로딩 중...

'팀명'에 접근하려면?(제목 제외)

코딩을 시작하기에 앞서서 작업할 순서를 떠올려 봅니다.

  1. 워크시트 A1 셀의 인접 영역(CurrentRegion)에 접근한다.
  2. 행 방향으로 1행 이동한다.
  3. A7:B7 영역은 작업 대상에서 제외한다(A2:B6).
  4. A2:B6 영역에 배경색을 지정한다.

이런 순서로 하면 되겠죠? "잘 설명된 문제는 이미 반은 해결된 문제"라는 찰스 케터링의 말이 떠오릅니다.

Sub coloringTeams()
  Dim rTbl As Range    ''' 대상 영역에 접근하기 위한 변수
  Set rTbl = Range("A1").CurrentRegion    ''' A1 셀의 인접 영역을 rTbl 변수에 할당(A1:B6)
  Set rTbl = rTbl.Offset(1).Resize(rTbl.Rows.Count - 1).Columns(1)
      ''' rTbl에 할당된 영역(A1:B6)에서 아래로 1행 이동(A2:B7)하고, 
      ''' 맨 마지막 행을 제외한 영역(A2:B6)의, 첫 번째 열(A2:A6)을 rTbl에 지정
  
  rTbl.Interior.ColorIndex = 15    ''' A2:A6 영역에 회색 음영 처리
End Sub

CODE

진부한 클리셰지만, Offset과 Resize 속성의 중요성은 아무리 강조해도 지나치지 않습니다. 셀이나 범위에 접근해서 무언가 작업을 할 때 필수적으로 사용되는 속성이므로 잘 익혀두시기 바랍니다.