プロが教えるわが家の防犯対策術!

EXCEL VBA でAPIを使って音源を再生しているのですが、すぐに再生されるときと、再生されるまでに3秒くらいかかるときがあるのですが、なぜでしょうか?

音源の再生のコードは下記のとおりです。

Call mciSendString("Play " & FILE_NAME1, "", 0, 0)

素人の質問で申し訳ありませんが、どなたか解決方法を教えてください。

このQ&Aに関連する最新のQ&A

輪唱」に関するQ&A: 輪唱について・・・・

A 回答 (4件)

質問者さんからの反応が全く無いので、これっきりにしますが、


midiファイルだと長さや音源の数で
再生まで時間が掛かる場合がありますが
これは仕方がないことだとおもいます。

wma、mp3 などでは10年以上前のPCでも遅延は発生しないです。
以前色々と試した時には、
まったく反応がなかったり、輪唱状態になったり (^_^;)
面白かったです orz
ダメもとで再生前に
Sub CloseMCI()
Dim pRc As Long
pRc = mciSendString("Close All", "", 0, 0) '全てのDeviceを閉じて解放 ?
If pRc <> 0 Then
Stop 'エラーの場合ここで止まる
End If
End Sub
を実行すると良いかもです。
http://homepage1.nifty.com/rucio/main/dotnet/Sam …
    • good
    • 0

こんばんは。



>すぐに再生されるときと、再生されるまでに3秒くらいかかるときがあるのですが、なぜでしょうか?

おそらく、オーバーヘッドといって、オブジェクトを読み込むためのメモリ確保の時間でしょう。解決は方法は特別ありませんが、一端、空ファイルを起動時などに読ませることができれば、速く再生するはずです。
    • good
    • 0

原因は存じませんが、昔Wavをメモリに読み込んで演奏するコードを切り貼りしたのを思い出して引っ張り出して来ました。

一旦読み込んだ後はメモリアクセスなので、時間は食わないと思います。但し、音源はWavファイル限定です。短時間の音源を即鳴らしたい時には使えるかもしれません。Win7Home(64bit) + xl2010(32bit)で動作しました。
全然短くない60M程度のファイルで試したところ、タスクマネージャで眺めるとメモリの占有も60M程度でした。ご参考まで。
'☆UserForm1モジュール

'Wav限定
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _
ByRef pszSound As Byte, ByVal hmod As Long, ByVal fdwSound As Long) As Long
'PlaySound(0,0,0)で止まるという記事通りには止まらないので苦肉の策
Private Declare Function PlaySound2 Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal pszSound As String, ByVal hmod As Long, ByVal fdwSound As Long) As Long

Private Const SND_ASYNC = &H1
Private Const SND_MEMORY = &H4
Private Const SND_LOOP = &H8

Dim BufSndTest() As Byte

Private Sub CommandButton1_Click()
PlaySound BufSndTest(0), 0, SND_ASYNC + SND_MEMORY + SND_LOOP
End Sub

Private Sub CommandButton2_Click()
Call PlaySound2(vbNullString, 0, 0)
End Sub

Private Sub UserForm_Activate()
ReadSoundBuffer GetDesktopPath & "\hoge.wav"
End Sub

'メモリに読み込んで、以降メモリデータを演奏
Private Function ReadSoundBuffer(WrkSndFile As String)
Dim WrkNumber As Long

WrkNumber = FreeFile()
Open WrkSndFile For Binary As WrkNumber
ReDim BufSndTest(LOF(WrkNumber))
Get WrkNumber, , BufSndTest
Close WrkNumber
End Function

'テスト用
Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function
    • good
    • 0

Open してから Play だと?



http://officetanaka.net/excel/vba/tips/tips22.htm
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwindows API  「mciSendString」 の連続再生について

VISUAL BASIC 6.0 で音楽再生ソフトを作ろうとしました。
windows API の「mciSendString」を使って、
例1のようにすると b.wav の音楽しか再生されません。
そこで、例2のようにすると、a.wav と b.wav が再生されましたが、
曲の途中では、"pause" と "resume" の命令が効きません。
連続再生ができて、曲の途中でも "pause" や "resume" の命令が効く方法を知りたいのですが、ご指導をお願いします。

<例1>
Call mciSendString("open c:\a.wav ", "", 0, 0)
Call mciSendString("play c:\a.wav ", "", 0, 0)
Call mciSendString("close c:\a.wav ", "", 0, 0)
Call mciSendString("open c:\b.wav ", "", 0, 0)
Call mciSendString("play c:\b.wav ", "", 0, 0)
Call mciSendString("close c:\b.wav ", "", 0, 0)

<例2>
Call mciSendString("open c:\a.wav ", "", 0, 0)
Call mciSendString("play c:\a.wav wait ", "", 0, 0)
Call mciSendString("close c:\a.wav ", "", 0, 0)
Call mciSendString("open c:\b.wav ", "", 0, 0)
Call mciSendString("play c:\b.wav wait ", "", 0, 0)
Call mciSendString("close c:\b.wav ", "", 0, 0)

VISUAL BASIC 6.0 で音楽再生ソフトを作ろうとしました。
windows API の「mciSendString」を使って、
例1のようにすると b.wav の音楽しか再生されません。
そこで、例2のようにすると、a.wav と b.wav が再生されましたが、
曲の途中では、"pause" と "resume" の命令が効きません。
連続再生ができて、曲の途中でも "pause" や "resume" の命令が効く方法を知りたいのですが、ご指導をお願いします。

<例1>
Call mciSendString("open c:\a.wav ", "", 0, 0)
Call mciSendString("pla...続きを読む

Aベストアンサー

> 具体的にイベント取得関数とはどのようなものでしょうか。

MCI へ Notify オプション付きのコマンドを渡して、コールバックされた終了
メッセージを受け取る...ということです。それしかないと思いますよ。

#2 の参考 URL にこのことが書いてあります。MCI を使った例でコールバック
のサンプルプロシージャも同サイトに記事がありますし...

http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/subc/

とりあえず、読んでみましょうよ。

ただ、#3 の方もコメントされてますが、VB ではサブクラス化という特殊な
技法が必要です。うっかりデバッグモードでプログラムを停止したりすると
OS ごとフリーズしますので、難易度は非常に高いです。

QVBAでMP3を鳴らしたい

vbaについて質問です。

MP3ファイルを鳴らしたいのですがうまくいきません。

---------------------------------------------------------
Sub Macro1()
Dim SoundFile As String
SoundFile = "C:\終了音.mp3"
If Dir(SoundFile) = "" Then
MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
Shell "mplay32.exe /play /close " & SoundFile
End Sub
---------------------------------------------------------
を実行すると、
「Shell "mplay32.exe /play /close " & SoundFile」
の部分で
実行時エラー53
ファイルが見つかりません。
になります。

しかし、

If Dir(SoundFile) = "" Then
MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If

の部分では問題ないので、ファイルはある事になってると思うのですが、
なぜ「Shell "mplay32.exe /play /close " & SoundFile」の部分でエラーになるのでしょうか?

スペックは、エクセル2007、windows7です。
ご回答よろしくお願いします。

vbaについて質問です。

MP3ファイルを鳴らしたいのですがうまくいきません。

---------------------------------------------------------
Sub Macro1()
Dim SoundFile As String
SoundFile = "C:\終了音.mp3"
If Dir(SoundFile) = "" Then
MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
Exit Sub
End If
Shell "mplay32.exe /play /close " & SoundFile
End Sub
---------------------------------------------------------
を実行すると、
「Shell "m...続きを読む

Aベストアンサー

まずは、当方の環境説明。
Windows7 64bit ,Office 2010 32bit

Wmplayer.exe について
検索すると二つ見つかりました。イミディエイトウィンドウでの確認だけですが
shell ("C:\Program Files\Windows Media Player\wmplayer.exe " & "C:\Windows\Media\tada.wav")
shell ("C:\Program Files (x86)\Windows Media Player\wmplayer.exe " & "C:\Windows\Media\tada.wav")
どちらでも、働きました。
/play /close オプションは有っても無駄なだけですので入れてません。
音楽ファイル名にスペースが含まれる場合は
shell ("C:\Program Files\Windows Media Player\wmplayer.exe " & """C:\Users\Public\Music\Sample Music\Sleep Away.mp3""")
のように。

APIを使用する場合。
標準でMP3ファイルが無いかなと探したら有りましてので・・。
以下をがばっと標準モジュールに貼り付けてみてください。

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 PlaySound()
  Dim SoundFile As String, rc As Long
  SoundFile = "C:\Users\Public\Music\Sample Music\Sleep Away.mp3" '多分有るかと?
  
  If Dir(SoundFile) = "" Then
    MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
    Exit Sub
  End If
  SoundFile = Chr(34) & SoundFile & Chr(34) 'スペース対策
  
  rc = mciSendString("Open " & SoundFile, "", 0, 0)
  rc = mciSendString("Play " & SoundFile, "", 0, 0)
  'rc = mciSendString("Play " & SoundFile & " wait", "", 0, 0)
  '↑演奏が終わるまで処理が返ってこないので没
  'rc = mciSendString("Close " & SoundFile, "", 0, 0)
  If rc <> 0 Then
    MsgBox rc & " ?のエラーです"
  End If

End Sub

Sub CloseSound()
  Dim SoundFile As String, rc As Long
  SoundFile = "C:\Users\Public\Music\Sample Music\Sleep Away.mp3"
  
'  If Dir(SoundFile) = "" Then
'    MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation
'    Exit Sub
'  End If
  SoundFile = Chr(34) & SoundFile & Chr(34)
  
'  rc = mciSendString("Open " & SoundFile, "", 0, 0)
'  rc = mciSendString("Play " & SoundFile, "", 0, 0)
  'rc = mciSendString("Play " & SoundFile & " wait", "", 0, 0)
  '↑演奏が終わるまで処理が返ってこないので没
  rc = mciSendString("Close " & SoundFile, "", 0, 0)
End Sub

これで、とりあえずは演奏・終了が出来ると思います。(要らないコメントは適当に)
どうやって音楽ファイルPathをモジュールに渡すか・・は
考えてみてください。

とっても参考になったところ(私自身、APIは門外漢です)VB6の話ですけど。
http://homepage1.nifty.com/rucio/main/technique/teq_1.htm

>エラーになりませんが、音楽も演奏されません
は前回回答の田中氏の
「・・いきなりPlayしていたのが原因かも・・」だと思います。

蛇足。
Wmplayer.exe が自動的に消えてくれないなら、いっそのこと
WorksheetにActiveX コントロールの、『Windows Media Player』を張り付けて
WorkSheetのダブルクリックイベントなどに
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Me.WMP.URL = Target.Value
Cancel = True
End Sub
とか・・でも。Target に音楽ファイルのフルパスがあると仮定。
※WMPは当方で付けたオブジェクト名です。デフォルトだと、WindowsMediaPlayer1
になりました。

まずは、当方の環境説明。
Windows7 64bit ,Office 2010 32bit

Wmplayer.exe について
検索すると二つ見つかりました。イミディエイトウィンドウでの確認だけですが
shell ("C:\Program Files\Windows Media Player\wmplayer.exe " & "C:\Windows\Media\tada.wav")
shell ("C:\Program Files (x86)\Windows Media Player\wmplayer.exe " & "C:\Windows\Media\tada.wav")
どちらでも、働きました。
/play /close オプションは有っても無駄なだけですので入れてません。
音楽ファイル名にスペースが含まれる場合は
...続きを読む


人気Q&Aランキング