메뉴
VBA 프로젝트 강의

[엑셀마리오게임] 셀 이동 및 확장

오빠두엑셀 by 오빠두엑셀
  • 학습시간 13분
  • 작성일 2018.09.29
  • 조회수 6,008회

VBA로 셀 이동 & 확장 매크로 만들기! (Range.Offset)

이 강의에서는 엑셀 VBA의 Range.Offset과 Resize 속성으로 기준 셀에서 이동·확장된 범위를 지정하는 방법을 정리합니다. Interior.Color 속성으로 범위에 배경색을 입히는 패턴까지 함께 익히고, 색상별 보조 명령문 5개와 메인 명령문 4개를 조합해 워크시트 위에 마리오 그림을 자동으로 출력하는 매크로를 직접 작성합니다.

[엑셀마리오게임] 셀 이동 및 확장
DOWNLOADS

실습자료를 준비했어요

수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇

1. Range.Offset 속성 이해하기

VBA에서 Range 개체의 Offset 속성은 기준이 되는 Range로부터 일정 거리만큼 떨어진 또 다른 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.Resize 속성 설명 바로가기
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가지 색상이 필요합니다. 기준 셀에서 이동·확장된 범위를 색상별로 손쉽게 채우기 위해, 아래와 같이 색상마다 보조 명령문(Sub Procedure) 5개를 작성합니다.

'################ 빨강색 ###################
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는 Right Walking, Mario_RJ는 Right Jump를 의미합니다.)

'##################################
'오른쪽 걷는 마리오
'##################################
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
댓글 5
5 (2개 평가)
Eunice
Eunice 2020.01.13 19:38
안녕하세요~
오늘 처음 접하고 강의 듣고 있습니다. 재밌고 유익한 강의 감사드려요~ ^^

네개의 마리오를 그리는 각 sub프로그램내에 존재하는 아래 두 문장의 역할이 뭔지 궁금합니다.
없어도 실행은 잘 되던데요. 왜 필요한지요?
게다가 mario라는 변수는 사용되지 않았는데 왜 정의가 필요하지요??
vba는 처음이라.. 자세히 설명 부탁드립니다..

dim mario as range
rng.activate
오빠두엑셀
오빠두엑셀 작성자 2020.01.13 20:18
안녕하세요~^^*
1) mario 변수는 제가 지정해놓고 사용하지 않았었네요... 말씀하신게 맞습니다. mario변수는 없어도 되는 변수입니다.
확인 감사드립니다.^^;;

2) rng.activate
이후 마리오 이동/점프 명령은,활성화된 셀 기준으로 그림이 출력됩니다. 따라서 마리오 그림을 출력할 기준셀을 잡아주는 부분이 되겠습니다.
Eunice
Eunice 2020.01.13 22:16
댓글 추가하기...와우~!! 빠른 답변 감사합니다^^
강민준🤗
강민준🤗 2024.08.09 11:12
좋은 강의 감사합니다🙇‍♂️
스크랩 완료