엑셀 VBA 컴퓨터 배경음악 출력하기 :: 엑셀 VBA 강의 3-4
1. Workbook.Path 속성 알아보기
VBA매크로 명령문을 이용하여 해당하는 워크북의 폴더경로를 반환합니다. 만약 사용중인 워크북의 파일명을 받아오고 싶은 경우엔 Workbook.FullName 속성을 이용하세요.
다만 주의사항으로는, 새로 작성한 워크북으로 파일 저장이 안되어 있으면 Workbook.Path 속성으로 빈칸을 출력합니다. 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 함수도 이용할 수 없습니다.
[링크] 위키피디아 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