• ベストアンサー

パソコン音声のミュートをVBAから制御するマクロ

パソコンの音声のミュートをエクセルVBAで制御する方法を教えてください。 設定した条件になるまでミュートし、条件に適ったらオンにしたいと思いますが、VBAの知識だけではどうしようも無いようです。 WAVEファイルを鳴らすことは出来ましたが種類が多くまとめて制御したいと思います。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#52504
noname#52504
回答No.3

ざっと調べてみましたが、どうも一筋縄ではいかないようですね。 私なら、いっそのこと音量を制御するソフトをShell関数で呼びます。 例えば、 ■Windows Volume Controller (WVC) http://www.vector.co.jp/soft/win95/art/se380707.html なんてソフトがありますが、 WVC.exe が C:\Program Files\Tools にあるとして、 '-----------------↓ ココカラ ↓--------------------- Sub Sample1()  'マスタ音量を0に  Shell "C:\Program Files\Tools\WVC.exe a0", vbHide End Sub Sub Sample2()  'マスタ音量を50に  Shell "C:\Program Files\Tools\WVC.exe a50", vbHide End Sub '-----------------↑ ココマデ ↑--------------------- (WinXP-Excel2003環境で動作確認済) もっとも、上記ソフトに関しては、 ミュートのON/OFF自体を切り替えるオプションがありませんし、 現在の音量を取得することもできないので、 「元の状態に戻す」ことはできません。 ■ボリュームリセット http://www.vector.co.jp/soft/winnt/art/se312770.html の方は、デバイス単位の制御はできませんが、 あらかじめミュート状態のデータファイルを用意しておけば、 現在の状態を記録⇒ミュート状態に移行⇒記録した状態に復帰 といった制御も可能だと思われます。 その他、より明示的にミュートのON/OFFを直接切り替えるソフトも 探せばあるのではないかと思います。 別のアプローチとしては、 sndvol32を開いてSendkeysで制御というのも考えましたが '-----------------↓ ココカラ ↓--------------------- Sub Sample3()  Shell "sndvol32", vbHide  SendKeys "%(M)", True  SendKeys " ", True  SendKeys "%{F4}", True End Sub '-----------------↑ ココマデ ↑--------------------- ウェイトをかけるなどしてうまく同期させないと、 きちんと動作しない場合がありますし、遅い印象です。 以上、ご参考まで。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

> 10数種類の音声である条件ではこれらを一斉に発音を止め、 > また復帰させるのが目的です。 サウンド再生の方法として sndPlaySound、mciSendString API などの API がありますが、ともに同時再生はできなかったように思います。恐らく ご希望のことを VB(A) でやろうと思えば DirectSound を使うしかないの ではないかと... > APIの詳細な説明にはついていけません。上記のような数行のコードで > できないものかと期待しています。 難しいです。VBA にない機能を使うのですから、そんな簡単にはできません。 多少は API に関する知識が必須ですし、少なくとも数行で実現できる内容 ではないと思います。 どうしても、、というのであれば、VECTOR などで比較的簡易なコードでも サウンド操作できるライブラリを探すというのもひとつの手ですよ。 http://www.vector.co.jp/soft/win95/prog/se050103.html http://tokyo.cool.ne.jp/kanain/APIHTM/DSGame.html

NazeTarou
質問者

お礼

deus ex machinaさんご丁寧な回答有難うございました。 参考にさせて頂ながらいろいろ試していました。 偶然引用したwavファイルがフォルダー違いで鳴らなかったので、これをヒントに10数個のファイルを傘下に入れているフォルダー名を変えてみました。 nameコマンドで存在しないフォルダー名に変えるとファイルが再生されずエラーも出ませんでした。復帰する時は正しいファイル名に変えます。 これで一挙に解決しました。 お手数かけましたが、苦闘しているうちの成果です。有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

>WAVEファイルを鳴らすことは なんというソフトを使いましたか。それを書かないで質問になりますか。 ーー 今までにも出たことのない高度な質問で、もしここに回答が付かなければ、もっと別の専門的なサイトに質問しては。 エクセルVBAやVBではそのソフトの実行時の初期のパラメータ指定で指定できる内容や停止、再開などだけで、進行中の状態で、制御をするのは、エクセルVBAやVB(初歩中級)の課題ではできないと思う。 http://www13.plala.or.jp/kymats/study/MULTIMEDIA/PlaySound_file_rsc.html など「WAVEファイル 再生」などでWEB照会したらどうですか。 他に「ミュート VBA」で照会。 http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200704/07040022.txt  など。 APIの領域に踏み込んでますね。 基本的に、何でも実行中のソフトを他のプログラムから制御できるものでは無いですよ。

NazeTarou
質問者

補足

初歩的な質問で達人なら直ぐそんな簡単なこととアドバイスがいただけると即断しました。舌足らずだったようです。 Waveは変数を宣言し以下のコードで鳴らしています。   Public Declare Function 音 Lib "winmm.dll" Alias "sndPlaySoundA" _ (ByVal ファイルの場所 As String, ByVal 制御フラグ As Long) As Long Public a As Long 'aは音声を出す値を返すための変数 a = 音("C:\aaa\bbb.wav", 2) 10数種類の音声である条件ではこれらを一斉に発音を止め、また復帰させるのが目的です。 事前に文字通り「ミュート VBA」で照会しましたが、APIの詳細な説明にはついていけません。上記のような数行のコードでできないものかと期待しています。

関連するQ&A

専門家に質問してみよう