Sub Sample1()
Dim SoundFile As String
SoundFile = "C:\Windows\Media\tada.wav"
If Dir(SoundFile) = "" Then
MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
Shell "mplay32.exe /play /close " & SoundFile
End Sub
Media Playerの実体であるmplay32.exeは、通常Windows\System32フォルダにあります。一般的に、このフォルダにはパスが通っていますので、ファイル名だけを指定すれば起動できます。もちろん、mplay32.exeが存在しないとShell関数は失敗します。
上記のサンプルを実行して、もしサウンドが鳴りやまないときは、Media Playerのオプションで[繰り返し]がオンになっているのかもしれません。タスクバーなどでMedia Playerを開き、[編集]メニューの[オプション]をクリックして表示される[オプション]ダイアログボックスで、[繰り返す]チェックボックスをオフにしてください。
Private Declare 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
Sub Sample2()
Dim SoundFile As String, rc As Long
SoundFile = "C:\Windows\Media\tada.wav"
If Dir(SoundFile) = "" Then
MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
rc = mciSendString("Play " & SoundFile, "", 0, 0)
End Sub
Sub Sample3()
Dim SoundFile As String, rc As Long
SoundFile = "C:\SoundData\pingpong.wav"
rc = mciSendString("Play " & SoundFile, "", 0, 0)
Debug.Print rc
End Sub
Sub Sample3()
Dim SoundFile As String, rc As Long
SoundFile = "C:\Sound Data\pingpong.wav"
rc = mciSendString("Play " & SoundFile, "", 0, 0)
Debug.Print rc
End Sub
Sub Sample3()
Dim SoundFile As String, rc As Long
SoundFile = Chr(34) & "C:\Sound Data\pingpong.wav" & Chr(34)
rc = mciSendString("Play " & SoundFile, "", 0, 0)
Debug.Print rc
End Sub
Sub Sample3()
Dim SoundFile As String, rc As Long
SoundFile = Chr(34) & "C:\Sound Data\pingpong.wav" & Chr(34)
rc = mciSendString("Open " & SoundFile, "", 0, 0)
Debug.Print rc
rc = mciSendString("Play " & SoundFile, "", 0, 0)
Debug.Print rc
rc = mciSendString("Close " & SoundFile, "", 0, 0)
Debug.Print rc
End Sub
う〜ん・・・これでも再生されません。あ!でもでも!イミディエイトウィンドウを見ると、いずれの返り値も0になっています。つまり、Open → Play → Closeは成功しているんです。成功しているのに、なぜ再生されないのだろう?はは〜ん、さては各コマンドが非同期で実行されているんだな。つまり、Playした結果を待たずに、すぐ次の命令であるCloseが実行されてしまったと。だから、コマンド自体は成功しても、結果的に再生されなかったと。たぶん、そうだろうな。で、調べてみたら、同期モードでPlayさせるスイッチがありました。
Sub Sample3()
Dim SoundFile As String, rc As Long
SoundFile = Chr(34) & "C:\Sound Data\pingpong.wav" & Chr(34)
rc = mciSendString("Open " & SoundFile, "", 0, 0)
rc = mciSendString("Play " & SoundFile & " wait", "", 0, 0)
rc = mciSendString("Close " & SoundFile, "", 0, 0)
End Sub