重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

よろしくお願いします
いつもgooの皆さんには大変お世話になっております
お陰様でどんな難問も解決できて大変助かっております

質問内容
セルの値が条件を満たしたらWAVEファイルを指定回数鳴らすマクロができたのですが
喜んだのもつかの間で、for nextで何回回しても1回しか演奏しないことがわかりました
ここまで苦労したのでがっかりです

そこでネットで見つけた Application.Wait (Now() + TimeValue("00:00:07"))
の1行を加えましたが、当然ながら、その間他の処理が進みません

そこで質問なのですが
処理を中断しないでwaveファイルの演奏を指定回数続けるのは不可能でしょうか?

以下はマクロです
V39のファイル名を渡してplay_wavマクロを繰り返す

For i = 1 To 5
Call play_wav(Range("V39"))
Application.Wait (Now() + TimeValue("00:00:07"))
Next i

どなたか解決策を教えていただけますか?
無理ならば残念ですがあきらめます
以上です。よろしくお願いします。

質問者からの補足コメント

  • HAPPY

    なんどもお世話になっております
    先ほどは、補足するつもりでお礼になってしまいました
    早速やってみます

    ThisWorkbook.Pathを初めて知りました
    これは前から知りたかったことで、また一つ勉強になりました
    ありがとうございます

    午後から仕事でお礼が遅れます

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/03/07 11:21
  • hallo-2007さんこんばんは
    仕事の都合でこの時間になりました

    親切に教えていただきありがとうございます
    今までにやったことがない方法なので、できるかどうかわかりませんが
    トライしてみます

    結果が楽しみです
    ありがとうございました

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/03/08 01:28

A 回答 (3件)

すいません。

mciSendStringでの同期再生方法は分かりませんでした。
mciSendStringではないのですが、PlaySoundであれば、次のようにすればできます。

Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _
ByVal pszSound As String, _
ByVal hmod As Long, _
ByVal fdwSound As Long _
) As Long
Public Const SND_ASYNC = &H1 '非同期再生
Public Const SND_SYNC = &H0 '同期再生

Sub sample()
Dim WrkSndFile As String
WrkSndFile = ThisWorkbook.Path & "\test.wav"
PlaySound WrkSndFile, 0, SND_SYNC
PlaySound WrkSndFile, 0, SND_SYNC
PlaySound WrkSndFile, 0, SND_SYNC
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ママチャリさんこんばんは
お礼が遅れました
二度も教えていただいて恐縮です
PlaySound WrkSndFile, 0, SND_ASYNC を使わせていただきます
これで1回音を出して、そのあとに
Application.Speech.Speakをすることにしました
WrkSndFile = ThisWorkbook.Path & "\Alarm01.wav" の
ThisWorkbook.Path が勉強になりました
ありがとうございました

お礼日時:2016/03/08 00:58

通りがかりで失礼します。

お酒も飲んだので・・・
私がよく使う手ですが
VBSで、WMPlayer.OCX を操作します。
メモ等を開いて
Dim wmp
Set wmp = CreateObject("WMPlayer.OCX")
wmp.settings.volume = 100 '音量設定
wmp.URL = "C:\Windows\Media\Alarm06.wav" '再生するwavファイルパス

For i=1 To 5
wmp.Controls.play()'再生
Do
WScript.sleep 5
Loop Until wmp.playState = 1 '停止迄待つ
wmp.Controls.currentPosition = 0 '冒頭に巻き戻す
Next

を張り付けて、拡張子を .vbs として保存
上記の例では、5回再生、ボリュームの設定も可能
こんなファイルを幾つか準備

エクセルからは
Sub ボタン1_Click()
Dim strPath As String
Dim RetVal As Variant
strPath = "パス\test.vbs"
RetVal = Shell("WScript.exe """ & strPath & """")
End Sub

で希望のvbsファイルを実行させます。
他にも
IEのBGMで音楽と映像(メッセージ)を流すとか・・
メモ帳開いて
<html>
<head>
<title>アラーム</title>
<bgsound src="C:\Windows\Media\Alarm06.wav" loop="5">
</head>
<body>
<marquee height="100" scrollamount="3" direction="up">
<FONT size="7">
<FONT color="red">
<Center>
もう時間ですよ。
</body>
</html>
</marquee>

名前を付けて保存で
拡張子 .html
クリックすると IEが起動して、音楽が流れる。
繰り返し再生は loop="infinite"
この回答への補足あり
    • good
    • 0
この回答へのお礼

お世話になっております
補足を使ってしまったのでお礼で質問させてください

strPath = "パス\test.vbs"
の部分ですが、VBSファイル名がHALLO.vbsなので
strPath = "C:\Users\maa\Downloads\HALLO.vbs"
でいいですか?
「スクリプトファイルが見つかりません」のエラーメッセが出ます
ファイルは確かに"C:\Users\maa\Downloads\HALLO.vbs"
にあるのですが・・・

また、
Dim wmp
Set wmp = CreateObject("WMPlayer.OCX")
wmp.settings.volume = 100 '音量設定
wmp.URL = "C:\Windows\Media\Alarm06.wav" '再生するwavファイルパス

For i=1 To 5
wmp.Controls.play()'再生
Do
WScript.sleep 5
Loop Until wmp.playState = 1 '停止迄待つ
wmp.Controls.currentPosition = 0 '冒頭に巻き戻す
Next
はNext iでいいですか?

お礼日時:2016/03/08 02:14

1回しかならないのは、非同期再生になっているからだと思います。

これを同期再生にすれば、回数だけなるのですが、それではダメなのですよね。
どうしても非同期で鳴らしたいのであれば、次のようにすれば可能ではありますが…。

maamaaさんが作ったplay_wavプロシジャをplay_wavs(s付)で包みました。
play_wavsは、PlayCount がゼロになるまで、7秒後に自分自身を呼びつつけます。

Option Explicit
Dim PlayCount As Long

Sub main()
PlayCount = 5
Call play_wavs
End Sub

Sub play_wavs()
If PlayCount = 0 Then Exit Sub
PlayCount = PlayCount - 1
Call play_wav(Range("V39"))
Application.OnTime (Now() + TimeValue("00:00:07")), "play_wavs"
End Sub
    • good
    • 0
この回答へのお礼

早朝からありがとうございます
教えていただいた方法でやってみます

ちなみに、以下はmciSendStringを使った現在のマクロですが、どこか直せば
同期再生になるでしょうか?

Sub play_wav(ByVal kyoku As String)

Dim wav_name As String
wav_name = "C:\Windows\Media\" & kyoku
If Dir(wav_name) = "" Then
MsgBox wav_name & "が見つかりません。"
Exit Sub
End If
mciSendString "Play " & wav_name, "", 0, 0
End Sub

お礼日時:2016/03/07 09:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!