엑셀 VBA 범위 이동 확장 및 셀 선택 & 마리오 그림 그리기 :: 엑셀 VBA 강의 3-3
1. Range.Offset 속성 이해하기
VBA에서의 Range(범위)개체 Offset 속성은 또 다른 Range(범위) 개체를 출력하는 속성입니다. 선택된 Range를 기준으로 입력한 숫자만큼 아래로 몇 칸 / 오른쪽으로 몇 칸을 이동한 셀을 결과값으로 반환합니다.
Range.Offset(상하이동, 좌우이동)

Sub Offset_Test() Dim Rng As Range '// A1셀을 Rng로 할당합니다. Set Rng = Range("A1") '// A1셀에서 밑으로 1칸, 우측으로 2칸을 이동한 셀(C2)을 선택합니다. Rng.Offset(1, 2).Select End Sub
[링크] 마이크로소프트 Range.Offset 속성 설명 바로가기
https://docs.microsoft.com/en-us/office/vba/api/excel.range.offset
2. Range.Resize 함수 이해하기
VBA Range(범위)개체의 Resize 속성은 워크시트에서 사용하는 OFFSET 함수의 선택인수 (3번째, 4번째 인수)와 같은 동작을 합니다. 기준셀에서 입력한 숫자만큼 위아래로 몇 칸, 좌우로 몇 칸 넓힌 범위를 결과값으로 반환합니다. 각 인수는 반드시 1보다 크거나 같아야 합니다. (0이나 음수를 입력하면 오류메세지를 출력합니다.)
Range.Resize(상하확장, 좌우확장)

Sub Resize_Test() Dim Rng As Range '// A1셀을 Rng로 할당합니다. Set Rng = Range("A1") '// A1셀을 선택합니다. Rng.Select '// A1셀에서 아래로 5칸, 우측으로 5칸 넓힌 범위를 선택합니다. '// (A1:E5) Rng.Resize(5, 5).Select End Sub
[링크] 마이크로소프트 Range.Offset 속성 설명 바로가기
https://docs.microsoft.com/en-us/office/vba/api/excel.range.resize
3. Range.Interior.Color 속성 이해하기
Range(범위) 개체의 Interior.Color는 선택된 범위의 배경색을 칠하는 속성입니다. 배경색을 지정하기 위해 VB기준색상 (vbRed, vbBlue,.. 등) 또는 RGB를 지정하여 이용할 수 있다고 이전강의에서 설명드렸습니다. 자세한 내용은 이전 강의를 참고하세요.
Range.Interior.Color = ColorIndex
Sub BG_Red() Dim WS As Worksheet Dim Rng As Range '// WS와 Rng를 각각 Sheet1과 Sheet1에 사용자지정범위로 등록된 "하트"로 할당합니다. Set WS = ThisWorkbook.Worksheets("Sheet1") Set Rng = WS.Range("하트") '// "하트"의 배경색을 RGB(0,255,0)으로 칠합니다. Rng.Interior.Color = RGB(0, 255, 0) End Sub
[링크] 마이크로소프트 Range.Interior.Color 속성 설명 바로가기
https://docs.microsoft.com/en-us/office/vba/api/excel.interior.color
4. 기준셀에서 이동/확장 된 범위의 배경색을 입히는 명령문 작성
마리오그림을 그리기 위해서는 5개의 색상(빨강색, 검정색, 파랑색, 갈색, 살색)이 필요합니다. 각각의 기준셀로부터 이동하고/확장된 범위를 원하는 색상으로 편하게 칠하기 위하여 아래와 같이 5개의 보조명령문(Sub-Procedure)를 작성합니다.
'################ 빨강색 ################### Sub FillRed(Rng As Range, row As Long, col As Long, Optional ExtRow As Long = 1, Optional ExtCol As Long = 1) On Error Resume Next Rng.Offset(row, col).Resize(ExtRow, ExtCol).Interior.Color = vbRed End Sub '################ 검정색 ################### Sub FillBlack(Rng As Range, row As Long, col As Long, Optional ExtRow As Long = 1, Optional ExtCol As Long = 1) On Error Resume Next Rng.Offset(row, col).Resize(ExtRow, ExtCol).Interior.Color = vbBlack End Sub '################ 살색 ################### Sub FillSkin(Rng As Range, row As Long, col As Long, Optional ExtRow As Long = 1, Optional ExtCol As Long = 1) On Error Resume Next Rng.Offset(row, col).Resize(ExtRow, ExtCol).Interior.Color = RGB(255, 230, 153) End Sub '################ 갈색 ################### Sub FillBrown(Rng As Range, row As Long, col As Long, Optional ExtRow As Long = 1, Optional ExtCol As Long = 1) On Error Resume Next Rng.Offset(row, col).Resize(ExtRow, ExtCol).Interior.Color = RGB(198, 89, 17) End Sub '################ 파랑색 ################### Sub FillBlue(Rng As Range, row As Long, col As Long, Optional ExtRow As Long = 1, Optional ExtCol As Long = 1) On Error Resume Next Rng.Offset(row, col).Resize(ExtRow, ExtCol).Interior.Color = vbBlue End Sub
5. 기준셀에서 마리오 그림을 그리는 명령문 작성
각각의 색깔로 배경색을 칠하는 5개의 보조명령문을 작성하였으면, 지정한 기준셀에서 마리오그림을 그리는 아래의 4개의 명령문을 작성합니다. (Mario_RW는 RightWalking, Mario_RJ는 RightJump를 의미합니다.)
'################################## '오른쪽 걷는 마리오 '################################## Sub Mario_RW(Rng As Range) Dim Mario As Range Rng.Activate FillRed Rng, 0, 4, , 4 FillRed Rng, 1, 3, , 8 FillRed Rng, 9, 0 FillRed Rng, 8, 1, 2 FillRed Rng, 7, 2, 4 FillRed Rng, 7, 3, 2 FillRed Rng, 7, 5, 2 FillRed Rng, 7, 6, 2 FillRed Rng, 7, 8, 2 FillRed Rng, 8, 9, 3 FillRed Rng, 8, 10, 2 FillRed Rng, 9, 11 FillRed Rng, 15, 0 FillRed Rng, 14, 1, 2 FillRed Rng, 14, 2, 2 FillRed Rng, 14, 3, 2 FillRed Rng, 14, 8, 2 FillRed Rng, 14, 9, 2 FillRed Rng, 14, 10, 2 FillRed Rng, 14, 11, 2 FillBlack Rng, 2, 7, 2 FillBrown Rng, 2, 2, , 3 FillBrown Rng, 3, 1, 3 FillBrown Rng, 3, 3, 2 FillBrown Rng, 4, 4 FillBrown Rng, 5, 7, , 3 FillBrown Rng, 4, 8 FillBrown Rng, 5, 2 FillSkin Rng, 3, 2, 2 FillSkin Rng, 5, 3, 2 FillSkin Rng, 3, 4 FillSkin Rng, 5, 4, 2 FillSkin Rng, 2, 5, 5 FillSkin Rng, 2, 6, 5 FillSkin Rng, 4, 7 FillSkin Rng, 6, 7 FillSkin Rng, 2, 8, 2 FillSkin Rng, 6, 8 FillSkin Rng, 3, 9, 2 FillSkin Rng, 4, 10 FillSkin Rng, 10, 0, 3 FillSkin Rng, 10, 1, 3 FillSkin Rng, 11, 2 FillSkin Rng, 11, 9 FillSkin Rng, 10, 10, 3 FillSkin Rng, 10, 11, 3 FillBlue Rng, 7, 4, 7 FillBlue Rng, 9, 3, 5 FillBlue Rng, 12, 2, 2 FillBlue Rng, 9, 5, 4 FillBlue Rng, 9, 6, 4 FillBlue Rng, 7, 7, 7 FillBlue Rng, 9, 8, 5 FillBlue Rng, 12, 9, 2 End Sub '################################## '오른쪽 점프하는 마리오 '################################## Sub Mario_RJ(Rng As Range) Dim Mario As Range Rng.Activate FillRed Rng, 0, 6, , 4 FillRed Rng, 1, 5, , 8 FillRed Rng, 2, 12, , 4 FillRed Rng, 3, 12, , 4 FillRed Rng, 4, 13, , 3 FillRed Rng, 5, 12, , 3 FillRed Rng, 6, 12, , 2 FillRed Rng, 7, 11, , 2 FillRed Rng, 7, 7, , 3 FillRed Rng, 8, 8, , 3 FillRed Rng, 7, 1, , 5 FillRed Rng, 8, 0, , 6 FillRed Rng, 9, 1, , 6 FillRed Rng, 10, 5 FillRed Rng, 11, 2, 5 FillRed Rng, 12, 1, 4 FillRed Rng, 13, 0, 3 FillRed Rng, 12, 3 FillRed Rng, 10, 13, 3 FillRed Rng, 8, 14, 5 FillRed Rng, 8, 15, 5 FillRed Rng, 8, 6 FillSkin Rng, 3, 4, 2 FillSkin Rng, 5, 5, 2 FillSkin Rng, 5, 6, 2 FillSkin Rng, 3, 6 FillSkin Rng, 2, 7, 5 FillSkin Rng, 2, 8, 5 FillSkin Rng, 4, 9 FillSkin Rng, 6, 9, , 3 FillSkin Rng, 2, 10, 2 FillSkin Rng, 3, 11, 2 FillSkin Rng, 4, 12 FillSkin Rng, 0, 12, , 4 FillSkin Rng, 1, 13, , 3 FillSkin Rng, 9, 0, 3 FillSkin Rng, 10, 1, 2 FillSkin Rng, 10, 2 FillBrown Rng, 3, 3, 3 FillBrown Rng, 2, 4, , 3 FillBrown Rng, 3, 5, 2 FillBrown Rng, 4, 6 FillBrown Rng, 5, 4 FillBrown Rng, 2, 11 FillBrown Rng, 4, 10 FillBrown Rng, 5, 9, , 3 FillBlue Rng, 7, 6 FillBlue Rng, 10, 3, 2 FillBlue Rng, 13, 3, 3 FillBlue Rng, 10, 4, 6 FillBlue Rng, 11, 5, 5 FillBlue Rng, 10, 6, 5 FillBlue Rng, 8, 7, 7 FillBlue Rng, 9, 8, 6 FillBlue Rng, 9, 9, 5 FillBlue Rng, 7, 10 FillBlue Rng, 9, 10, 5 FillBlue Rng, 8, 11, 5 FillBlue Rng, 8, 12, 5 FillBlack Rng, 2, 9, 2 End Sub '################################## '왼쪽 걷는 마리오 '################################## Sub Mario_LW(Rng As Range) Rng.Activate FillRed Rng, 0, 4, , 4 FillRed Rng, 1, 1, , 8 FillRed Rng, 9, 0 FillRed Rng, 8, 1, 2 FillRed Rng, 8, 2, 3 FillRed Rng, 7, 3, 2 FillRed Rng, 7, 5, 2 FillRed Rng, 7, 6, 2 FillRed Rng, 7, 8, 2 FillRed Rng, 7, 9, 4 FillRed Rng, 8, 10, 2 FillRed Rng, 9, 11 FillRed Rng, 14, 0, 2 FillRed Rng, 14, 1, 2 FillRed Rng, 14, 2, 2 FillRed Rng, 14, 3, 2 FillRed Rng, 14, 8, 2 FillRed Rng, 14, 9, 2 FillRed Rng, 14, 10, 2 FillRed Rng, 15, 11 FillSkin Rng, 4, 1 FillSkin Rng, 3, 2, 2 FillSkin Rng, 2, 3, 2 FillSkin Rng, 4, 4, , 3 FillSkin Rng, 3, 5, , 3 FillSkin Rng, 2, 5, , 2 FillSkin Rng, 5, 5, , 4 FillSkin Rng, 6, 3, , 6 FillSkin Rng, 3, 9, 2 FillSkin Rng, 10, 0, 3 FillSkin Rng, 10, 1, 3 FillSkin Rng, 11, 2 FillSkin Rng, 11, 9 FillSkin Rng, 10, 10, 3 FillSkin Rng, 10, 11, 3 FillBlue Rng, 12, 2, 2 FillBlue Rng, 9, 3, 5 FillBlue Rng, 7, 4, 7 FillBlue Rng, 9, 5, 4 FillBlue Rng, 9, 6, 4 FillBlue Rng, 7, 7, 7 FillBlue Rng, 9, 8, 5 FillBlue Rng, 12, 9 FillBrown Rng, 5, 2, , 3 FillBrown Rng, 4, 3 FillBrown Rng, 2, 7, , 3 FillBrown Rng, 3, 8 FillBrown Rng, 4, 7, , 2 FillBrown Rng, 5, 9 FillBrown Rng, 3, 10, 3 FillBlack Rng, 2, 4, 2 End Sub '################################## '왼쪽 점프하는 마리오 '################################## Sub Mario_LJ(Rng As Range) Rng.Activate FillRed Rng, 0, 6, , 4 FillRed Rng, 1, 3, , 8 FillRed Rng, 2, 0, , 4 FillRed Rng, 3, 0, , 4 FillRed Rng, 4, 0, , 3 FillRed Rng, 5, 1, , 3 FillRed Rng, 6, 2, , 2 FillRed Rng, 7, 3, , 2 FillRed Rng, 8, 0, 5 FillRed Rng, 8, 1, 5 FillRed Rng, 10, 2, 3 FillRed Rng, 8, 5, , 3 FillRed Rng, 7, 6, , 3 FillRed Rng, 7, 10, , 5 FillRed Rng, 8, 9, , 7 FillRed Rng, 9, 9, , 6 FillRed Rng, 10, 10 FillRed Rng, 12, 12 FillRed Rng, 11, 13, 5 FillRed Rng, 12, 14, 4 FillRed Rng, 13, 15, 3 FillBlue Rng, 8, 3, 5 FillBlue Rng, 8, 4, 5 FillBlue Rng, 7, 5 FillBlue Rng, 9, 5, 5 FillBlue Rng, 9, 6, 5 FillBlue Rng, 9, 7, 6 FillBlue Rng, 8, 8, 7 FillBlue Rng, 7, 9, 1 FillBlue Rng, 10, 9, 6 FillBlue Rng, 11, 10, 5 FillBlue Rng, 10, 11, 6 FillBlue Rng, 10, 12, 2 FillBlue Rng, 13, 12, 3 FillSkin Rng, 0, 0, , 4 FillSkin Rng, 1, 0, , 3 FillSkin Rng, 4, 3, , 2 FillSkin Rng, 3, 4, , 2 FillSkin Rng, 2, 5 FillSkin Rng, 2, 7, , 2 FillSkin Rng, 3, 7, , 3 FillSkin Rng, 4, 6, , 3 FillSkin Rng, 5, 7, , 4 FillSkin Rng, 6, 4, , 6 FillSkin Rng, 3, 11, 2 FillSkin Rng, 9, 15, 3 FillSkin Rng, 10, 14, 2 FillSkin Rng, 10, 13 FillBrown Rng, 2, 4 FillBrown Rng, 5, 4, , 3 FillBrown Rng, 4, 5 FillBrown Rng, 2, 9, , 3 FillBrown Rng, 3, 10 FillBrown Rng, 4, 9, , 2 FillBrown Rng, 3, 12, 3 FillBrown Rng, 5, 11 FillBlack Rng, 2, 6, 2 End Sub
6. 각각의 마리오 그림을 출력하는 명령문 작성

4개의 마리오 그림을 기준셀에서 이동해서 시트위에 출력하는 명령문을 작성합니다. 명령문 작성 후 실행하면 메시지박스가 출력되면서 4개의 마리오그림이 시트위에 각각 그려집니다.
'################################## '마리오 그림 출력하기 테스트 '################################## Sub Mario_Print_Test() Dim Rng As Range Set Rng = ThisWorkbook.Worksheets("Sheet1").Range("A1") MsgBox "마리오그림1을 출력합니다." Mario_RW Rng MsgBox "마리오그림2을 출력합니다." Mario_LW Rng.Offset(0, 20) MsgBox "마리오그림3을 출력합니다." Mario_RJ Rng.Offset(0, 40) MsgBox "마리오그림4을 출력합니다." Mario_LJ Rng.Offset(0, 60) End Sub