엑셀 VBA 배경음악 출력 매크로 총정리 :: VBA 기초

엑셀 VBA 매크로를 사용하여 배경음악을 출력하기 위한 mciSendString 함수의 기초사용법 및 마리오 게임소리를 출력하기 위한 예제코드를 살펴봅니다.

# VBA

작성자 :
오빠두엑셀
최종 수정일 : 2022. 11. 02. 03:57
URL 복사
메모 남기기 : (6)

엑셀 VBA 컴퓨터 배경음악 출력하기 :: 엑셀 VBA 강의 3-4

실습파일 무료E-Book 강의 PPT 파일 완성파일
첨부파일에 이상이 생겼을 경우, 1:1 문의하기로 연락주시면 신속히 해결해드리겠습니다. 

1. Workbook.Path 속성 알아보기

VBA매크로 명령문을 이용하여 해당하는 워크북의 폴더경로를 반환합니다. 만약 사용중인 워크북의 파일명을 받아오고 싶은 경우엔 Workbook.FullName 속성을 이용하세요.
다만 주의사항으로는, 새로 작성한 워크북으로 파일 저장이 안되어 있으면 Workbook.Path 속성으로 빈칸을 출력합니다. Workbook.Path 속성 이용하기 전 반드시 파일을 저장해주세요.

엑셀 배경음악 출력 VBA Workbook Path 예제

ActiveWorkBook.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 속성없이 코드를 작성해도 잘 동작합니다.

mciSendString ( 관련파일명, 반환값, 길이, 반환옵션 )
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로 변환과정에 오류가 발생하게 되며 mcsSendString 함수도 이용할 수 없습니다.

엑셀 배경음악 출력 VBA ShortPath 예제

[링크] 위키피디아 8.3 Flie Name에 대한 설명 바로가기
https://en.wikipedia.org/wiki/8.3_filename

4. GetShortPath 함수 분석

사용중인 엑셀파일의 Short Path를 불러오기 위해 GetShortPath 함수를 사용합니다. 함수의 인수로는 기존 Long Path 경로를 입력하게 되고, 출력값은 Short Path를 String(텍스트)형태로 반환합니다.

GetShortPath ( ActiveWorkBook.Path )
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
5 2 투표
게시글평점
6 댓글
Inline Feedbacks
모든 댓글 보기
6
0
여러분의 생각을 댓글로 남겨주세요.x