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

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

A 回答 (3件)

ざっと調べてみましたが、どうも一筋縄ではいかないようですね。


私なら、いっそのこと音量を制御するソフトをShell関数で呼びます。

例えば、
■Windows Volume Controller (WVC)
http://www.vector.co.jp/soft/win95/art/se380707. …
なんてソフトがありますが、
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. …
の方は、デバイス単位の制御はできませんが、
あらかじめミュート状態のデータファイルを用意しておけば、
現在の状態を記録⇒ミュート状態に移行⇒記録した状態に復帰
といった制御も可能だと思われます。

その他、より明示的にミュートのON/OFFを直接切り替えるソフトも
探せばあるのではないかと思います。

別のアプローチとしては、
sndvol32を開いてSendkeysで制御というのも考えましたが
'-----------------↓ ココカラ ↓---------------------
Sub Sample3()
 Shell "sndvol32", vbHide
 SendKeys "%(M)", True
 SendKeys " ", True
 SendKeys "%{F4}", True
End Sub
'-----------------↑ ココマデ ↑---------------------
ウェイトをかけるなどしてうまく同期させないと、
きちんと動作しない場合がありますし、遅い印象です。

以上、ご参考まで。
    • good
    • 0

> 10数種類の音声である条件ではこれらを一斉に発音を止め、


> また復帰させるのが目的です。

サウンド再生の方法として sndPlaySound、mciSendString API などの API
がありますが、ともに同時再生はできなかったように思います。恐らく
ご希望のことを VB(A) でやろうと思えば DirectSound を使うしかないの
ではないかと...

> APIの詳細な説明にはついていけません。上記のような数行のコードで
> できないものかと期待しています。

難しいです。VBA にない機能を使うのですから、そんな簡単にはできません。
多少は API に関する知識が必須ですし、少なくとも数行で実現できる内容
ではないと思います。

どうしても、、というのであれば、VECTOR などで比較的簡易なコードでも
サウンド操作できるライブラリを探すというのもひとつの手ですよ。

http://www.vector.co.jp/soft/win95/prog/se050103 …
http://tokyo.cool.ne.jp/kanain/APIHTM/DSGame.html
    • good
    • 0
この回答へのお礼

deus ex machinaさんご丁寧な回答有難うございました。
参考にさせて頂ながらいろいろ試していました。

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

お礼日時:2007/12/08 15:22

>WAVEファイルを鳴らすことは


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

この回答への補足

初歩的な質問で達人なら直ぐそんな簡単なこととアドバイスがいただけると即断しました。舌足らずだったようです。
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の詳細な説明にはついていけません。上記のような数行のコードでできないものかと期待しています。

補足日時:2007/11/29 20:06
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています