VBAで音楽ファイル(.mp3/.wav)を再生する方法【mciSendString関数(API)】
マクロを作成していると「音楽を流したい!」という場面に出くわすことがあります。
例えば、Windowsで警告メッセージが表示される時に鳴る「デュン↓」という音のようにマクロ操作時にも効果音を鳴らしたいという場合もあれば、はたまた、ただ単純にBGMとして音楽を鳴らしたいという場合など使用目的は多々あると思います。
という訳で今回はWindows APIの「mciSendString関数」というのを利用してVBAで音楽ファイル(.mp3や.wav)を再生する方法を解説していきます。今回学ぶことのできる内容は以下のとおりです。
mciSendString関数を使って音楽ファイルを再生する方法
mciSendString関数を使って音楽ファイルを停止する方法
音楽ファイルを再生可能にすることでマクロ実行中に効果音(SE)をつけたり、BGMをつけたりと通常のマクロでは再現することのできない多くの機能を盛り込むことができます。
mciSendString関数とは
mciSendString関数とはMCI(メディアコントロールインターフェイス)デバイスへ、コマンド文字列を送信することのできる関数です。
コマンドには再生や停止などのデバイスを制御するための情報が詰まっており、これをMCIデバイスに送ることで音楽ファイルの再生や停止、一時停止などの操作を行うことが可能になります。
mciSendString関数はVBAで用意されているものではなくWindows API(Application Programming Interface)の中にある関数です。Windows APIとは簡単にいえばWindowsに用意されている機能がまとまっているセットのようなものです。
VBAを使ってこのWindows APIを呼び出すことで、Windowsに用意されている様々な機能を使用することができます。(たとえばWindowsのシステム効果音を鳴らしたり、キーボードの入力を取得したりすることができます)
Windows APIをよく知らない方は「なんか難しそう」と感じると思いますがコードの内容はあまり難しいものではないので、VBAがある程度理解できている方であればすぐに理解することができます。
ちなみに名前からわかると思いますが、Windows APIではWindowsの機能を呼び出しているだけので基本的にはWindows以外のOSでは使用することはできません。
mciSendString関数の使い方
mciSendString関数を使うにははじめに「Windows APIのmciSendString関数を使うよ」と宣言する必要があります。
※宣言をしないとmciSendString関数は使えずエラーになるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く内容が変わってきます。
以下のどちらかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内でmciSendString関数を使うことができるようになります。
Private Declare PtrSafe Function mciSendString Lib “winmm.dll” Alias “mciSendStringA” _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function mciSendString Lib “winmm” Alias “mciSendStringA” _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
※操作環境のbitと構文があっていないとエラーになるので注意しましょう。
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。
1 2 3 4 5 6 7 8 9 |
#If Win64 Then Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long #Else Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long #End If |
この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
mciSendString関数の構文
mciSendString関数の構文は音楽ファイルの「再生」「停止」「一時停止」「一時停止からの再開」でそれぞれ書き方が変わります。各操作の構文は下記のとおりです。
Call mciSendString(“play ” & file, “”, 0, 0)
Call mciSendString(“stop ” & file, “”, 0, 0)
Call mciSendString(“pause ” & file, “”, 0, 0)
Call mciSendString(“resume ” & file, “”, 0, 0)
各コードを見ればわかるとおり基本的には同じ構文で、引数となる文字列の「play」や「stop」の値を書き換えることで、音楽ファイルの操作を行うことができます。
「file」には音楽ファイルのパスを入力します。
例えばデスクトップ上の「sample.mp3」を再生したい場合は、
「file」に「“C:\Users\ユーザー名\Desktop\sample.mp3”」と入力するだけです。
「”C:\Users\ユーザー名\Desktop\sam ple.mp3″」←NG
ここでは単純な内容しか扱っていませんが、より詳しく理解したい方は下記サイトを参照ください。
MCIコマンド文字列 – EternalWindows
mciSendString関数サンプルコード
実際にVBAマクロとして使用する場合は以下のように書きます。
「再生」や「停止」といった処理は関数として割り振っておくことで、ユーザーフォームのボタンで操作することも可能になります。使用状況に合わせて色々書き換えてみてください。
以下のコードは指定した音楽ファイルを再生するだけのサンプルコードです。
音楽ファイルの停止は”それ用のボタン”を作ったり、同じくAPIの「GetAsyncKeyState関数」を使ってキー入力による操作などで停止コマンドを送ってあげる必要があります。
コード自体を終了しても、音楽ファイルは鳴り続けるのであらかじめ注意しておきましょう。
(※初めは数秒で終わる音楽ファイルを使って再生確認することをオススメします)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#If Win64 Then Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long #Else Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long #End If '---------------------------------------------------------------------------------------------' Sub sample() Dim file As String file = "C:\Users\ユーザー名\Desktop\sample.mp3" '再生する音楽ファイルのフルパス Call PlayMusic(file) '再生 'Call StopMusic(file) '停止 'Call PauseMusic(file) '一時停止 'Call ResumeMusic(file) '一時停止から再開 End Sub '---------------------------------------------------------------------------------------------' Function PlayMusic(ByRef file As String) Call mciSendString("play " & file, "", 0, 0) End Function '---------------------------------------------------------------------------------------------' Function StopMusic(ByRef file As String) Call mciSendString("stop " & file, "", 0, 0) End Function '---------------------------------------------------------------------------------------------' Function PauseMusic(ByRef file As String) Call mciSendString("pause " & file, "", 0, 0) End Function '---------------------------------------------------------------------------------------------' Function ResumeMusic(ByRef file As String) Call mciSendString("resume " & file, "", 0, 0) End Function |
まとめ
今回はWindows APIの「mciSendString関数」を使った音楽ファイルの再生方法についてでした。
本ページの内容を理解していただけた方なら、たったの数行のコードだけでVBAで音楽ファイルを再生することができるということがご理解いただけたと思います。
「mciSendString関数」を使うことでご自身のマクロに、ユーザーインターフェース(UI)としてのサウンドを簡単に装備させることができます。色々試してより使いやすいマクロになるよう取り入れてみてください。