[엑셀마리오게임] 배경음악 출력 매크로
엑셀로 컴퓨터의 배경음악을 출력하는방법?! (mciSendString)
이 강의에서는 VBA 매크로로 컴퓨터의 배경음악을 재생하고 중단하는 방법을 다룹니다. winmm.dll의 mciSendString 함수와 Long Path를 Short Path로 변환하는 GetShortPath 함수를 결합해, 워크북과 같은 폴더에 위치한 mp3 파일을 안정적으로 출력하는 매크로를 작성하는 흐름까지 정리합니다.
VBA 프로젝트 강의
[엑셀마리오게임] 배경음악 출력 매크로
엑셀로 컴퓨터의 배경음악을 출력하는방법?! (mciSendString)
이 강의에서는 VBA 매크로로 컴퓨터의 배경음악을 재생하고 중단하는 방법을 다룹니다. winmm.dll의 mciSendString 함수와 Long Path를 Short Path로 변환하는 GetShortPath 함수를 결합해, 워크북과 같은 폴더에 위치한 mp3 파일을 안정적으로 출력하는 매크로를 작성하는 흐름까지 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
1. Workbook.Path 속성 알아보기
Workbook.Path 속성은 VBA 매크로 명령문으로 현재 워크북의 폴더 경로를 반환합니다. 사용 중인 워크북의 파일명까지 함께 받아오려면 Workbook.FullName 속성을 이용합니다.
다만 새로 작성한 워크북이 아직 저장되지 않았다면 Workbook.Path 속성은 빈 문자열을 반환합니다. 따라서 Workbook.Path 속성을 사용하기 전에는 반드시 파일을 먼저 저장해야 합니다.
Sub WorkBook_PathTest() MsgBox ActiveWorkbook.Path End Sub
[링크] 마이크로소프트 Workbook.Path 속성 공식 문서
https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.path
2. mciSendString 함수 알아보기
mciSendString 함수는 컴퓨터의 사운드 장치(Multimedia Control Interface)에 접근하여 지정한 음악을 재생하거나 중단하는 동작을 수행합니다. VBA에는 기본 내장되어 있지 않은 함수이므로 윈도우의 "winmm.dll" 라이브러리를 참조하여 별도로 선언해 사용합니다.
본 강의에서는 PtrSafe 키워드를 사용해 32비트와 64비트 환경 모두에서 호환되도록 작성했습니다. 32비트 엑셀에서만 사용한다면 PtrSafe 없이도 정상적으로 동작합니다.
Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias _ "mciSendStringA" (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As Any, ByVal uReturnLength As Long, ByVal _ hwndCallback As Long) As Long
[링크] 마이크로소프트 mciSendString 함수 공식 문서
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757161(v=vs.85).aspx
3. Long Path 와 Short Path란?
오늘날 대부분의 환경에서 사용하는 폴더 경로는 Long Path(파일·폴더 이름을 모두 표시) 방식이지만, 윈도우 95 이전에는 Short Path(파일·폴더 이름의 앞 6자리만 표시) 방식이 사용되었습니다. Short Path는 다른 이름으로 8.3 파일 관리 체계(8.3 File Name)라고도 부릅니다.
이번 강의에서 사용하는 mciSendString 함수는 파일 경로를 Short Path 형식으로 받기 때문에 일반적인 Long Path를 그대로 인수로 넣으면 오류가 발생합니다. 따라서 Long Path를 Short Path로 변환하는 작업이 반드시 필요하며, 변환 시 다음 사항에 유의해야 합니다.
- Short Path는 파일 또는 폴더명의 앞 6글자만 표시하고 그 이후는 물결표("~")와 숫자로 대체합니다.
- Short Path에서는 아래 특수문자를 사용할 수 없습니다. (" * + , / : ; < = > ? \ [ ] |) 따라서 폴더 경로나 파일명에 위 특수문자가 포함되어 있으면 Long Path를 Short Path로 변환할 때 오류가 발생하며, mciSendString 함수도 정상적으로 동작하지 않습니다.
[링크] 위키피디아 8.3 File Name 설명
https://en.wikipedia.org/wiki/8.3_filename
4. GetShortPath 함수 분석
사용 중인 엑셀 파일의 Short Path를 가져오기 위해 GetShortPath 함수를 사용합니다. 인수로는 기존 Long Path 경로를 입력하며, 결과값은 Short Path를 텍스트(String) 형태로 반환합니다.
Public Function GetShortPath(strFileName As String) As String '// File System Object를 생성합니다. Dim fso As Variant Set fso = CreateObject("Scripting.FileSystemObject") '// 만약 FSO가 파일로 존재할 경우 File의 ShortPath를 반환합니다. If fso.FileExists(strFileName) Then GetShortPath = fso.GetFile(strFileName).ShortPath Exit Function End If '// 만약 FSO가 폴더로 존재할 경우 File의 ShortPath를 반환합니다. If fso.FolderExists(strFileName) Then GetShortPath = fso.GetFolder(strFileName).ShortPath Exit Function End If End Function
5. 컴퓨터의 배경음악 출력 / 중단하기
앞에서 살펴본 GetShortPath 함수와 mciSendString 함수를 응용하여 원하는 음악 파일을 재생합니다. 이번 예제에서는 재생할 음악 파일이 실행 중인 엑셀 파일과 같은 폴더에 위치해야 하며, mp3 파일명은 다른 음악 파일 이름(예: MarioJump.mp3 등)으로 자유롭게 변경할 수 있습니다.
- 여러 개의 음악 파일을 동시에 재생하면 모든 음악이 중첩되어 함께 출력됩니다.
- 음악 파일이 재생되는 도중 실행 중인 엑셀 파일을 닫으면 출력 중이던 음악도 함께 중단됩니다.
'############################## '해당 경로의 음악을 출력합니다. '############################## Public Sub PlaySound() Dim FileName As String '// 현재 사용중인 워크북과 같은 폴더에 위치한 marioBGM.mp3 파일경로를 LongPath로 받아옵니다. FileName = ActiveWorkbook.Path & "\marioBGM.mp3" '// Long Path를 Short Path로 변환합니다. FileName = GetShortPath(FileName) '// mciSendString 함수를 통해 해당경로의 음악을 출력한 뒤, 출력되지 않았을 경우 메세지박스를 띄웁니다. Play = mciSendString("play " & FileName, 0&, 0, 0) If Play <> 0 Then MsgBox "오디오파일을 확인할 수 없습니다. 다시 확인해주세요" End If End Sub '############################## '해당 경로의 음악이 출력중일 경우, 음악을 중단합니다. '############################## Public Sub StopSound() Dim FileName As String FileName = ActiveWorkbook.Path & "\marioBGM.mp3" FileName = GetShortPath(FileName) Play = mciSendString("close " & FileName, 0&, 0, 0) End Sub
6. 예제파일에 사용된 전체 명령문
본 강의에서 사용된 전체 명령문은 아래와 같습니다. 자세한 동작 설명은 영상 강의를 참고해 주세요. 내용이 도움이 되셨다면 글 아래에 응원의 댓글을 남겨 주시면 감사하겠습니다.
'########################### 'Sound 모듈 '########################### Option Explicit Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias _ "mciSendStringA" (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As Any, ByVal uReturnLength As Long, ByVal _ hwndCallback As Long) As Long Dim Play Public Function GetShortPath(strFileName As String) As String Dim fso As Variant Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(strFileName) Then GetShortPath = fso.GetFile(strFileName).ShortPath Exit Function End If If fso.FolderExists(strFileName) Then GetShortPath = fso.GetFolder(strFileName).ShortPath Exit Function End If End Function Sub Path_Test() MsgBox ThisWorkbook.Path MsgBox GetShortPath(ThisWorkbook.Path) End Sub Public Sub PlaySound() Dim FileName As String FileName = ActiveWorkbook.Path & "\marioBGM.mp3" FileName = GetShortPath(FileName) Play = mciSendString("play " & FileName, 0&, 0, 0) If Play <> 0 Then MsgBox "오디오파일을 확인할 수 없습니다. 다시 확인해주세요" End If End Sub Public Sub StopSound() Dim FileName As String FileName = ActiveWorkbook.Path & "\marioBGM.mp3" FileName = GetShortPath(FileName) Play = mciSendString("close " & FileName, 0&, 0, 0) End Sub '########################### 'Test 모듈 '########################### Option Explicit Sub VBA3_4() PlaySound '// Mario_Print 명령문은 이전 강의내용을 참고하세요. Mario_Print End Sub
웹상의 음악파일은 mciSendString 라이브러리로 출력하실 수 없습니다.
관련된 내용을 인터넷에 검색해보니 http 라이브러리로 비슷하게 구현한 영상이 있어 올려드리니 참고하시면 도움이 될 듯 합니다.
https://www.youtube.com/watch?v=wU8dLgiGxUQ
감사합니다.
완성파일과 오디오파일을 같은 폴더안에 넣은 뒤 실행해보시겠어요?
감사합니다.