• ベストアンサー

計算結果で音が鳴らず困っています、、

こちらで、ご教授してもらったものを使わせて頂いているのですが、 どうしてもうまくいかないことが出て、行き詰まってしまい、、、 皆さん、度々すいませんが手助けできましたらお願いします。 エクセルのセルの結果表示のところで、 在庫追加となったら音がなるようにしたいのですが、 手打ち(コピペなど)で結果表示の所に (例えばA3に)ブドウ追加と入れると指定した音が鳴ります。 ですが、結果表示の所は関数にしてて 計算結果によって(ブドウ追加って答えが出たら) 音が鳴るようにしたいのですが、音が鳴らなくて困っています。 A1の所が、ブドウ注文数4個になると、A3は"在庫あり"から"ブドウ追加"となるので 音が鳴るはずなんですが、鳴らないんです、、、 また、複数同時に結果表示が変わっても(ブドウ追加とバナナ追加が同時に起こっても)音が鳴るようにしたいのですが、少しイジるも、うまくいかず、やれるのかどうかもわかっていません。 Excel2003のBOOK1の中で セル A1 ブドウ注文数2個 A2 ブドウ在庫数3個 A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示) A5 バナナ注文数2個 A6 バナナ在庫数3個 A7 =IF(A5>A6,"バナナ追加","在庫あり")(←結果表示) A9 トマト注文数2個 A10 トマト在庫数3個 A11 =IF(A9>A10,"トマト追加","在庫あり")(←結果表示) A13 ミカンなど続いていきます・・・。 A14 ・・・・・・・ A15 ・・・・・・・ ----------↓現在、教えてもらったものを少しイジった状態です↓--------- 1.標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long 2.シートモジュールのchangeイベントに Private Sub Worksheet_Change(ByVal Target As Range)   With Target     '一度に複数のセルの値が変化した時はExit     If .Count > 0 Then Exit Sub     '変化したセルがA3,A7,A11の範囲に無ければExit     If Intersect(.Cells, Range("A3,A7,A11")) Is Nothing Then Exit Sub     Select Case True       Case .Value Like "*ブドウ追加*"         Shell "mplay32.exe /play /close c:\サウンド\ブドウ.wav"       Case .Value Like "*バナナ追加*"         Shell "mplay32.exe /play /close c:\サウンド\バナナ.wav"       Case .Value Like "*トマト追加*"         Shell "mplay32.exe /play /close c:\サウンド\トマト.wav"       End Select     End With End Sub

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

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

横レス失礼します。 今までの流れとは違ったアプローチになり恐縮ですが、以下の方法を 試してみて下さい。 1)Worksheet_Change イベントは削除します 2)標準モジュールに下部※以下のユーザー定義関数を貼り付けます 3)A3 に入力する数式 =IF(A1>A2,"ブドウ追加"&PlayWave("C:\Sound\ブドウ追加音.wav"),"在庫あり") ユーザー定義関数をワークシートで使用した場合、ユーザー定義関数内に 書かれた Excel の操作コマンドは全て無効化されてしまいますが、 今回のように「サウンドを鳴らす」など Excel とは無関係なコマンドは 無効化されません。この特性を利用します。 Wave 再生に都度 MediaPlayer を起動するのでは、コストが高すぎるので、 PlaySound API を使用しました。同期再生させてますので、恐らく RSS から いくつかのセルが同時入力(正確には若干のタイムラグがあるはず)されても、 順次再生されていくのではないかと。 実際には試してない(試す環境がない)ですけども・・・ ' ※以下標準モジュールに貼り付けるユーザー定義関数 ' // Wave ファイルを再生する API ' // 複数の WAV の同時再生はできない。同期再生の場合は、 ' // 再生終了まで一切の操作ができない。 ' Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _     ByVal lpszName As String, _     ByVal hModule As Long, _     ByVal dwFlags As Long) As Long Private Const SND_SYNC As Long = &H0 ' 同期再生 Private Const SND_ASYNC As Long = &H1 ' 非同期再生 Private Const SND_PURGE As Long = &H40 ' 再生停止 ' // Wave ファイルを再生する. ' Public Function PlayWave(ByVal WaveFileName As String) As String      ' @引数 WaveFileName : 再生する Wave ファイル名   ' 必ず長さ0の文字列を返す      Call PlaySound(WaveFileName, 0&, SND_SYNC)   PlayWave = vbNullString End Function

mensgoo
質問者

お礼

KenKen_SPさん、、、、 エクセレントです!!!凄い!!! 下記の悩んでいる点、3つ、すべて解決しましたッ 1.関数をかましても音が鳴るようにできたら最高です! 「鳴ります!」 2.結果表示によって音が振り分けられたら、もっと最高なんです! 「いくつでも振り分けられます!」 3.結果表示が同時に起こっても、音が2つ鳴る、もしくは結果表示が2つ以上出たよ音が指定できたら、パーフェクト!! 「ご指摘通り、3つ同時に結果を出してテストした所、3つ別々の音がズレながらすべて鳴りました!」 RSSの自動取得はまだわかりませんが、多分大丈夫っぽいです。 『素晴らしい』としか言いようがありません。 感無量過ぎます、、感謝感激の乱れ打ちです、、 本当に本当にありがとうございます! ここまで来れたのは、皆さんの力なくしては絶対ありえなかったことで、KenKen_SPさんの感謝の意を伝える所で、マナーがなっていないのは重々承知していますが、xls88さんが凄く力を貸してくれて、頑張ってこれたのは間違いありません。 xls88さん筆頭に、KenKen_SPさん、watabe007さん、imogasiさん、cistronezkさん、Trick--o--さん、nagareさん、全員のおかげだと思っています。 本当にありがとうございました!

その他の回答 (10)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.11

>回答番号:No.9 この回答へのお礼 希望が叶いそうで良かったです。 私も上級者の技に触れることができ嬉しいです。 暇をみてKenKen_SPさんのコードを研究させていただきます。

mensgoo
質問者

お礼

そう言って頂けるとありがたいです! 長い間、本当にありがとうございました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.9

>※A1の関数をなくし、例えば数字の5を手打ちすると音が出ます! 回答番号:No.4でも書きましたが Rss入力されるのはB列ですから、B列をTargetに改編すべきです。

mensgoo
質問者

お礼

xls88さん、何度も何度も、長い時間、人生の貴重な時間を割いて頂き、ホントに本当に感謝しています。 KenKen_SPさんの回答、そしてレスを見て頂ければ、と思います。 この質問をしてから、皆さんの回答すべてが参考になり、 勉強になり、その中でも最後まで諦めず、答えを探してくれた xls88さん、 『最高です!ありがとうございました!』 (同じ言葉しかでず、すいません)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.8

A列の結果表示セルにwavファイル名その物が表示されるなら Select Case文を使わず、直接セルの値を変数に代入すれば良いと思います。 wavfile = .Offset(2).Value で、wavファイル名を取得できることになります。

mensgoo
質問者

補足

なるほど、参考になり、もの凄く勉強になります!」 (知識が違い過ぎて、感心するばかりです、、) あと 言い尽くされた言葉かもわかりませんが、Excel、奥が深いですね、、

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.7

>ブドウ追加音で間違いないです。 Select Case文でwavファイル名をセットしています。 正しいファイル名に書き換えて、変数を使えるようにしてください。 Select Case True Case .Offset(2).Value Like "*ブドウ追加*": wavfile = "ブドウ追加音"  ・  ・(他のファイル名も正しく書き直す)  ・  End Select

mensgoo
質問者

補足

xls88さん、なるほど、変数理解したというか、はい、 しっかり書きました。エラーなくちゃんと動作しています! (音は鳴りませんが、A1に手打ちすると鳴ります) Private Sub Worksheet_Change(ByVal Target As Range) Dim wavfile As String With Target '一度に複数のセルの値が変化した時はExit If .Count > 1 Then Exit Sub '変化したセルがA1の範囲に無ければExit If Intersect(.Cells, Range("A1")) Is Nothing Then Exit Sub Select Case True Case .Offset(2).Value Like "*ブドウ追加*": wavfile = "ブドウ追加音" End With If wavfile <> "" Then Shell "mplay32.exe /play /close c:\サウンド\" & wavfile & ".wav" End If End Sub --------- Excel2003の状況↓ A1 SUM=b1-b2(関数) A2 ブドウ在庫数3個(固定数字) A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示) B1 手打ちで5 B2 手打ちで1 ※A1の関数をなくし、例えば数字の5を手打ちすると音が出ます!

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

今までの内容で、手打ち入力でChangeイベントが作動するのは確認済みです。 RSSによるデータ入力が無ければテストは無意味です。 代替え環境が用意できますか? できなければRSSによる自動入力があるまでに、手打ち入力で上手く動くように整備しておけばどうでしょうか。 >手打ちでB1かB2に数字を入れると(他のセルに何か入れても) >動いています!とメッセは出ますが、音は出ません。 A1にTargetを限定しているのだから当然の結果です。 '変化したセルがA1の範囲に無ければExit If Intersect(.Cells, Range("A1")) Is Nothing Then Exit Sub あと、気になるのは >Shell "mplay32.exe /play /close c:\サウンド\ブドウ追加音.wav" 何故、wavファイル名に変数を使わないのですか? それから wavファイル名が、「ブドウ追加音」となっています。 提示例なら、今までは、「ブドウ」のはずでした。 根本的なことを途中で変えると混乱の元です。 真のファイル名はどうなっているのですか? 自分で応用されているなら無問題です。

mensgoo
質問者

補足

xls88さん、またもや本当にありがとうございます。 >RSSによるデータ入力が無ければテストは無意味です。 代替え環境が用意できますか? できなければRSSによる自動入力があるまでに、手打ち入力で上手く動くように整備しておけばどうでしょうか。 そうですね、確かに自動入力がないので 中途半端な感じなんですが、最初は自動でも手動でも とにかくターゲットとしてるセルの文字表示が変われば 音は鳴るだろうと、容易に考えていましたので。。 >あと、気になるのは >Shell "mplay32.exe /play /close c:\サウンド\ブドウ追加音.wav" 何故、wavファイル名に変数を使わないのですか? すいません、恥ずかしながら変数を理解してるに至らず、 最初にxls88さんにご教授してもらったものを音声ファイル名を少し変えてやってみたものの、音が鳴らず、上記のようにしたら鳴ったので、良かった良かったと一安心してたんです。 >それから wavファイル名が、「ブドウ追加音」となっています。 提示例なら、今までは、「ブドウ」のはずでした。 根本的なことを途中で変えると混乱の元です。 真のファイル名はどうなっているのですか? 自分で応用されているなら無問題です。 すいません、ブドウ追加音で間違いないです。 ※単にブドウというファイル名もあり、ブドウ追加発注音や ブドウ大至急音、など色々あって、、、すいません。 ここまでやってもらい、ホントに感謝感謝でいっぱいです! とりあえず、今から再度色々イジって、xls88さんに教えてもらったリンクも参照しながら、諸々やってみます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

>回答番号:No.4 この回答への補足 >つまり、 >A1 SUM=b1-b2(関数)のb1-b2の所は自動的に取得する数値なんです。 ということは、Targetをb1-b2のようなセルにやってみたがChangeイベントが発生しなかったということですか? イベントは発生しているが、音が出なかった、というようなことはないでしょうか? コード内の1行目に Msgbox "動いています!" とでも入れてみればどうなりますか? メッセージが出ればChangeイベントは発生していることになります。 あと過去ログを紹介しておきます。 Wendy02さんの回答が参考になるかもしれません。 エクセル マクロについて http://oshiete1.goo.ne.jp/qa4651304.html >これ以上xls88さんに頼るわけにもいきませんし、・・・・・ 投稿された質問をスキルアップの題材にしています。 勝手にやっていることですからご心配なく、逆にスキル不足でご迷惑かもしれませんがご容赦願います。

mensgoo
質問者

お礼

xls88さん、やってみました。 下記の通りです。 xls88さんにご教授してもらったものを少しイジり 下記にしました。 手打ちでB1かB2に数字を入れると(他のセルに何か入れても) 動いています!とメッセは出ますが、音は出ません。 ------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim wavfile As String MsgBox "動いています!" With Target '一度に複数のセルの値が変化した時はExit If .Count > 1 Then Exit Sub '変化したセルがA1の範囲に無ければExit If Intersect(.Cells, Range("A1")) Is Nothing Then Exit Sub Select Case True Case .Offset(2).Value Like "*ブドウ追加*": wavfile = "ブドウ" End Select End With If wavfile <> "" Then Shell "mplay32.exe /play /close c:\サウンド\ブドウ追加音.wav" End If End Sub ------------- Excel2003の状況↓ A1 SUM=b1-b2(関数) A2 ブドウ在庫数3個(固定数字) A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示) B1 手打ちで5 B2 手打ちで1 ※A1の関数をなくし、例えば数字の5を手打ちすると メッセも音も出ます! ※土曜は午前まで、日曜は商店が休みなので自動でRSSが送られることがないので、手打ちしかできない状態です。

mensgoo
質問者

補足

xls88さん、度々申し訳ありません。 さらに返事が遅れてしまいすいません。 近所の本屋さんにExcelVBAの本を読みあさりに行っており、 ただいま帰ってきました(^_^;) 下記の件、早速やってみて、再度報告します! (スキルアップの題材、優しい嘘か誠かわかりませんが、 そう言って貰えると本当にありがたいです!) >イベントは発生しているが、音が出なかった、というようなことはないでしょうか? コード内の1行目に Msgbox "動いています!" とでも入れてみればどうなりますか? メッセージが出ればChangeイベントは発生していることになります。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.4

回答1でも書きましたが、数式の計算結果を、Changeイベントでは捕捉出来ないようです。 ただし、私のレベルでは断定できません。鵜呑みにしないでください。 そこで、Changeイベントを使うなら、手入力されるセルをTargetにする必要があります。 他にもあるかも知れませんが、コピーされる場合もChangeイベントが発生するのでOKです。 >A1 SUM=b1-b2(関数) >A2 ブドウ在庫数3個(固定数字) >A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示) この場合、B1あるいはB2には手入力されるのでしょうか? それなら If Intersect(.Cells, Range("A1,A5,A9")) Is Nothing Then Exit Sub の部分を書き換えれば良いことになります。 A3から値("*ブドウ追加*")を取る部分も考え直さなければなりません。 >回答番号:No.3 この回答への補足 上記のようなことで良ければ 問題点は3つともクリアできます。 まず、1と2を片づけてから3に取り組みましょうか。 今まで寄せられた、皆さんのアドバイスでやれると思いますからひとまず頑張ってみてください。 出来なければ遠慮なく捕捉相談してください。 余談ですが 自分で応用してやろうという姿勢は称賛に値します。 上から目線ですみません。

mensgoo
質問者

補足

xls88さん、本当にありがとうございます! 貴重なお時間を割いて頂き、本当に感謝しております。 A1 SUM=b1-b2(関数)の、 源泉、元になる数字の部分なんですが、 手入力ではなく、自動的に数字が変わるんです。 当方、野菜も扱う果物屋をやっており、受注や在庫チェックに使うために作成しようと思っているんですが(余談です) 商店(大元)のほうから、注文が自動的にrssを通じて送られてくるんです。 それに対してExcelをつなげると、b1及びb2の数値が自動的に変わり、 それに連動して、A1の数値も当然のごとくコロコロ変わります。 つまり、 A1 SUM=b1-b2(関数)のb1-b2の所は自動的に取得する数値なんです。 最初は本当に1つヒントでも教えてもらったら、後は応用していくらでもいける!と知識も薄いのに容易に考えていましたが、、、 自動取得の数値を通して、結果を音で知らせたりするのは 相当難しいんですね。。 でもなんとか勉強してみます!これ以上xls88さんに頼るわけにもいきませんし、何より貴重なお時間を割くわけにいかないので、あとはスルーして頂ければ問題ありませんので。(本当にスルーで全然OKですから)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

本分を読み返してみました。 >また、複数同時に結果表示が変わっても >(ブドウ追加とバナナ追加が同時に起こっても)音が鳴るようにしたいのですが、 この条件を全く考えていませんでした。 再考してみます。 因みに、全く同時に入力される方法はどうされているのでしょうか? よければ教えてください。

mensgoo
質問者

補足

xls88さん、本当にありがとうございます。 (つい先ほど、補足を入れて、今見たら回答数が増えてるのに気づき) >因みに、全く同時に入力される方法はどうされているのでしょうか? よければ教えてください。 ちょっとまとめますと、 今悩んでいる点は3つなんです。 1.関数をかましても音が鳴るようにできたら最高です! (一個前の補足に書いた感じです) 2.結果表示によって音が振り分けられたら、もっと最高なんです! (ブドウならブドウ音、バナナならバナナ音) 3.結果表示が同時に起こっても、音が2つ鳴る、もしくは結果表示が2つ以上出たよ音が指定できたら、パーフェクト!! 本見たら、グーグル検索で、教えてサイト参考にしたら比較的簡単にできると思ったら、、まったくできず、、 (xls88さんはじめ、その他答えてくださった皆さんのおかけでココまで辿り着けたようなものです)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

>見事にできたんですが、 >ブドウはブドウの音、バナナはバナナの音、 >と各答えに関して、音を振り分ける設定を色々とやっているんですが、 >うまくいかず、試行錯誤中です。 振り分けるようになっているのですが、、、 そのままで使えませんか? 何が、「見事にできた」のでしょうか? 疑問です。 それから 何故、Shell関数のコードが2度も出てくるのでしょうか? 更に >Shell "mplay32.exe /play /close c:\サウンド\ブドウ.wav" & wavfile & "ブドウ" は書き方が間違っています。 本文で提示されたコード >Shell "mplay32.exe /play /close c:\サウンド\ブドウ.wav" で音は鳴っていると思います。 私が提示したコードでは 上記コードの「ブドウ」の部分ですが Select Case文で、条件にあった、wavファイル名(拡張子なし)を変数(wavfile)に格納しています。 そして SHell関数のコードで、フォルダのパスと拡張子の間に、&演算子で変数(wavfile)を入れ込んでいます。 Shell "mplay32.exe /play /close c:\サウンド\" & wavfile & ".wav" ですから修正する必要はなく、そのまま使えるはずです。

mensgoo
質問者

補足

xls88さん、すいません、言葉足らずでした。 (早々の回答、本当に感謝です) 見事に音は出るんですが、If wavfile <> "" Thenより下の部分は 下記の方法で音が出ました↓ If wavfile <> "" Then Shell "mplay32.exe /play /close c:\サウンド\ブドウ追加.wav" End If End Sub 困っている点が、答え(結果表示)によって音を振り分けるのに試行錯誤中です。 あと、A1,A5,A9に関数を入れてやると音が出ないところなんです。 ↓こうやると音が出なくなります。関数を入れてるからなんですが。。どうにか鳴らないかなぁと数時間頑張ってるんですが。。 A1 SUM=b1-b2(関数) A2 ブドウ在庫数3個(固定数字) A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

'一度に複数のセルの値が変化した時はExit If .Count > 0 Then Exit Sub 変化したセルが、1つの場合もExit Subしてしまいます。 If .Count > 1 Then Exit Sub あるいは If .Count >= 2 Then Exit Sub としてください。 '変化したセルがA3,A7,A11の範囲に無ければExit If Intersect(.Cells, Range("A3,A7,A11")) Is Nothing Then Exit Sub 数式の計算動作は、Changeイベントでは捕捉出来ないようです。 Calculateイベントがありますが、Targetの特定が難しそうです。 そこで、注文数の入力セルをTargetにしてChangeイベントを使えばどうでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim wavfile As String With Target '一度に複数のセルの値が変化した時はExit If .Count > 1 Then Exit Sub '変化したセルがA1,A5,A9の範囲に無ければExit If Intersect(.Cells, Range("A1,A5,A9")) Is Nothing Then Exit Sub Select Case True Case .Offset(2).Value Like "*ブドウ追加*": wavfile = "ブドウ" Case .Offset(2).Value Like "*バナナ追加*": wavfile = "バナナ" Case .Offset(2).Value Like "*トマト追加*": wavfile = "トマト" End Select End With If wavfile <> "" Then Shell "mplay32.exe /play /close c:\サウンド\" & wavfile & ".wav" End If End Sub あと、↓のコードですが >'変化したセルがA3,A7,A11の範囲に無ければExit >If Intersect(.Cells, Range("A3,A7,A11")) Is Nothing Then Exit Sub Targetが多いとRangeの指定が大変だとおもいます。 Mod関数で、Targetの行を特定するような方法を考えればどうでしょうか。

mensgoo
質問者

補足

xls88さん、回答ありがとうございます。 見事にできたんですが、 ブドウはブドウの音、バナナはバナナの音、 と各答えに関して、音を振り分ける設定を色々とやっているんですが、 うまくいかず、試行錯誤中です。 最後のほうの Shell "mplay32.exe /play /close c:\サウンド\ブドウ.wav" & wavfile & "ブドウ" Shell "mplay32.exe /play /close c:\サウンド\"バナナ.wav & wavfile & "バナナ" End If End Sub と、やってもできず、悩み中です。

関連するQ&A