오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
VBA 프로젝트 강의

[엑셀마리오게임] 마리오 이동 명령문

오빠두엑셀 by 오빠두엑셀
  • 학습시간 24분
  • 난이도 전문가
  • 작성일 2019.01.23

마리오를 움직여보자! 마리오 이동 명령문 (KeyPressAPI 응용)

이 강의에서는 마리오 게임 시리즈에서 핵심이 되는 키 입력 처리를 다룹니다. KeyPressAPI 모듈과 Select Case 문을 조합해 방향키 입력에 따라 마리오를 좌우로 이동시키고, PlaySound 함수에 인수를 추가해 음악을 자유롭게 제어하는 게임 시작·종료 명령문까지 차근차근 정리합니다.

[엑셀마리오게임] 마리오 이동 명령문
DOWNLOADS

실습자료를 준비했어요

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

1. 음악출력함수(Play/StopSound)에 인수 추가하기

이전 강의에서 작성한 음악출력/중단 함수(PlaySound/StopSound)인수를 추가합니다. 함수 내부 변수로 고정해 두었던 FileName(음악파일 경로)을 인수로 받도록 변경하면, 다른 명령문에서도 PlaySound/StopSound를 엑셀 함수처럼 자유롭게 호출할 수 있습니다.

엑셀 VBA 게임 만들기 음악 출력 인수 추가

'// 변경된 음악출력/중단 함수 전문
 
Public Sub PlaySound(FileName As String)
 
FileName = GetShortPath(FileName)
 
Play = mciSendString("play " & FileName, 0&, 0, 0)
If Play <> 0 Then
   MsgBox "오디오파일을 확인할 수 없습니다. 다시 확인해주세요"
End If
 
End Sub
 
Public Sub StopSound(FileName As String)
 
FileName = GetShortPath(FileName)
 
Play = mciSendString("close " & FileName, 0&, 0, 0)
 
End Sub

2. Select Case 문 이용하기

키 입력 받기 모듈(KeyPressAPI 모듈)을 제대로 응용하려면 Select Case 문의 기본 동작 방식을 먼저 이해해야 합니다. 아래 이미지처럼 “A1” 셀에 ‘등심’이라는 값이 입력되어 있다고 가정하겠습니다.

엑셀 VBA Select Case문 예제

'// Select Case문 사용예제
 
Select Case Range("A1").Value  '// = 등심
 
    case "사과", "오렌지", "귤"
        msgbox "과일입니다."
    case "오이", "배추", "상추"
        msgbox "야채입니다."
    case "등심", "안심", "삼겹살"
        msgbox "고기류입니다."
    case else
        msgbox "기타 재료입니다.“
 
end select

Select Case 문은 먼저 A1 셀의 값인 ‘등심’을 받아옵니다.
이후 각 Case(논리 조건)을 순서대로 비교합니다.
1) 사과 / 오렌지 / 귤인 경우,
⇨ “과일입니다” 안내 메시지 출력
2) 오이 / 배추 / 상추인 경우,
⇨ “야채입니다” 안내 메시지 출력
3) 등심 / 안심 / 삼겹살인 경우,
⇨ “고기류입니다” 안내 메시지 출력
4) 위의 세 경우에 모두 해당하지 않을 경우,
⇨ “기타 재료입니다” 안내 메시지 출력

이 예제에서 받아온 값은 셀 A1의 “등심”이므로 세 번째 Case에 매칭되고, “고기류입니다.” 메시지를 출력한 뒤 Select Case 문은 종료됩니다.

  • Select Case 문은 IF 문보다 가독성이 뛰어납니다. 처리해야 할 조건이 3개 이상이라면 Select Case 문 사용을 적극 권장합니다.
  • 엑셀 최대 행 개수인 약 100만 개 자료를 단순 반복 계산할 때, Select Case 문은 IF 문보다 약 3~5초 정도 느리게 동작합니다. 프로그래밍 관점에서는 치명적인 차이지만, 엑셀에서 100만 행 단위 자료를 한 번에 다루는 경우는 드물고 대부분 10만 행 이내에서 작업합니다. 따라서 실무에서 체감되는 속도 차이는 거의 없으므로, 여러 조건을 처리할 때는 Select Case 문 사용을 권장합니다.
  • Select Case 문은 For 문과 함께 사용해 선택된 범위 안의 셀을 하나씩 비교하며 논리 계산을 할 때 자주 활용됩니다. 이 응용 패턴은 이후 관련 강의에서 자세히 다루겠습니다.

3. GameSheet에 KeyPressAPI 시트모듈 붙여넣기

이전 강의에서 만든 KeyPressAPI 모듈을 GameSheet 시트 모듈 안에 복사하여 붙여넣기 합니다. KeyPressAPI 모듈에 대한 자세한 설명은 아래 영상 강의를 참고하세요.

KeyPressAPI 클래스 모듈 관련 강의 바로가기

'########################################################################################################################
'# 해당 명령문에 대한 저작권은 오빠두엑셀(https://www.oppadu.com)에 있습니다.
'# 모든 정보는 Cretive Commns License에 의해 저작권을 보호받습니다.
'# 영리를 목적으로 하지 않는 사용 및 공유는 허용됩니다. 반드시 저작자, 오빠두엑셀(https://www.oppadu.com)을 명시해야합니다.
'# This VBA Code is protected by Creative Commons License.
'# All information can be posted, uploaded, shared at online for NON-commercial use only.
'# The Author, '오빠두엑셀(https://www.oppadu.com)' have to be mentioned when you post this code.
'########################################################################################################################
 
Dim WithEvents KeyPressWatcher As KeyPressAPI
 
Sub Start_KeyPress()
 
If KeyPressWatcher Is Nothing Then
    Set KeyPressWatcher = New KeyPressAPI
End If
 
KeyPressWatcher.StartKeyPress
 
End Sub
 
Sub End_KeyPress()
 
If KeyPressWatcher Is Nothing Then Exit Sub
KeyPressWatcher.StopKeyPress
 
End Sub
 
Private Sub KeyPressWatcher_KeyPressed(ByVal KeyAscii As LongPtr, ByVal KeyCode As LongPtr, ByVal Target As Range, Cancel As Boolean)
 
'(msgMessage.wParam, iKeyCode, Selection, blnCancel)
 
'// 여기에 키입력시 동작할 명령문을 작성하세요.
 
End Sub

4. 이전 강의에서 만들었던 보조함수/변수 활용하여 명령문 작성하기

이전 강의에서 만든 보조 함수와 공통 변수를 활용해 게임 시작/종료 명령문을 작성합니다. 지금까지 준비한 함수와 변수 목록은 다음과 같습니다.

A. 키입력 이벤트 모듈 (KeyPressAPI)

  • A-1. Start_KeyPress :
    키 입력 받기 이벤트를 활성화합니다.
  • A-2. End_KeyPRess :
    키 입력 받기 이벤트를 종료합니다.
  • A-3. KeyPressWatcher_KeyPressed :
    입력된 키를 함수의 인수로 반환합니다.

B. 시트 초기화 모듈

  • B-1. Init :
    활성화된 셀을 기준으로 시트를 초기화합니다.
  • B-2. Sheet_Init :
    전체 시트를 초기화합니다.

C. 공통변수

  • C-1. Facing :
    마리오가 바라보는 방향을 저장합니다.
  • C-2. PointRng :
    마리오를 출력할 기준 셀을 가리킵니다.

5. 게임 시작/종료 명령문 작성

A. KeyPressWatcher_KeyPressed 이벤트 명령문 작성

'// ###############################################
'// KeyPressWatcher_KeyPressed 명령문 안에 넣어주세요
'// ###############################################
 
Select Case CLng(KeyAscii)
 
'// 만약 입력된키가
'// 1. 오른쪽 방향키
    Case 39   '/39 = 오른쪽 방향키
        If pointRng.Column >= 76 Then Exit Sub
    '// Facing = True
        Facing = True
    '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제)
        init pointRng
    '// 활성화된 셀을 오른쪽으로 한칸 이동
        Set pointRng = pointRng.Offset(0, 1)
    '// 활성화된 셀을 기준으로 오른쪽을 바라보고 있는 마리오 그림을 출력
        Mario_RW pointRng
 
'// 2. 왼쪽방향키
    Case 37  '/37 = 왼쪽 방향키
        If pointRng.Column = 1 Then Exit Sub
    '// Facing = false
        Facing = False
    '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제)
        init pointRng
    '// 활성화된 셀을 왼쪽으로 한칸 이동
        Set pointRng = pointRng.Offset(0, -1)
    '// 활성화된 셀을 기준으로 왼쪽을 바라보고 있는 마리오 그림을 출력
        Mario_LW pointRng
 
End Select

B. 게임시작/종료 명령문 작성

Sub Game_Start()
 
'// 혹시모를 상황에 대비하여 게임을 실행하는 범위 외의 셀을 초기화
    GameSheet.Range("CN:XFD").Delete
    GameSheet.Range("47:1048576").Delete
 
'// BGM 출력
    StopSound ActiveWorkbook.Path & "\MarioBGM.mp3"
    PlaySound ActiveWorkbook.Path & "\MarioBGM.mp3"
 
'// 이전에 만들었던 함수 사용 -> 시트 초기화
    Sheet_init
 
'// 마리오게임을 시작하기 위한 시작셀을 지정 (PointRng)
    Set pointRng = GameSheet.Range("F21")
 
'// Facing = True
    Facing = True
 
'// 키입력받기 이벤트를 활성화
    Start_KeyPress
 
End Sub
 
Sub Game_End()
 
'// 키입력 받기를 종료
    End_KeyPress
 
'// 실행중인 마리오 게임 음악 종료
    StopSound ActiveWorkbook.Path & "\MarioBGM.mp3"
 
'// 마리오 게임 종료 음악 출력
    PlaySound ActiveWorkbook.Path & "\PlayerDown.mp3"
 
'// 메세지 박스 출력
    MsgBox "게임이 종료되었습니다."
 
End Sub
댓글 3
5 (3개 평가)
jintiie
jintiie 2021.04.03 13:21
대단한 엑셀대가이십니다. 많이많이 배우고있어요
한데 다운해서 되던 파일을 다른곳에 저장하니 음악오류메서지가 나오는데
파일경로 변해그런가요. 대책이 있는지 궁금한데요. 도움을 바래요.
진심바쳐 열심히 강의하시니 정말 고마워요. JINTIE
jintiie
jintiie 2021.04.03 16:04
오빠두님 오류가 해결되였어요. 파일명을 영문으로 고침하니 오유 당장에 쾅! 계속 힘내서 많은 도움 주세요. JINTIe
강민준🤗
강민준🤗 2024.08.09 11:14
좋은 강의 감사합니다🙇‍♂️