• ベストアンサー

ビープ音

添付ファイルをご覧下さい。 B列、C列、D列には、それぞれ関数が埋め込められています。 A列に、数値を入力することによって●、☆☆、▼▼▼等の 文字が表示するように設定しています。 これら特殊文字が出現した際、「ビープ音」が出る方法を 教えて下さい。 添付ファイルから申し上げますと ビープ音が鳴る場合としては A列に数値「5」、「99」、「15」、「6」、「35」を入力した際 となります。 尚、ビープ音は「ピ、ピ」の2回といたします。 私は、VBAの知識は皆無ですので、具体的にご教授して頂ければ 幸いです。よろしくお願いします。

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.4

なんか、できた気がする。ちょいと確認してみてください。 原型ないけどANo.1ベース。処理内容は・・・  1. A範囲(B11:B19)に入力があった時に  2. 入力セルを参照するBCD範囲(D11:D19,F11:G11)のセルが  3. "●", "☆☆", "▼▼▼"のいずれかなら  4. Beepを2回鳴らす 2の「参照するセル」とは入力で再計算される全セル。例えば  D11 "=hoge(B11)"、F11 "=B11" ←直接参照  G11 "=fuga(D11)" ←間接参照も含む A,B~Dのアドレス、記号、Beep間隔は必要に応じて変更で。 一応、添付のイメージに合わせたつもりです。 以下、コード。 'ANo.1と同じく、シートモジュールに貼り付けてください。 '----------------------------------------------- 'セル変更時イベント Private Sub Worksheet_Change(ByVal Target As Range)  '他にも処理いれたい時に備えて、念のため関数化。  BeepNaruyo Target 'ビープ鳴るよ! End Sub 'ビープ鳴るよ!関数名はてきとう。 Private Sub BeepNaruyo(ByVal Target As Range)  Dim rng As Range, c As Range, adr_input$, adr_check$  Dim i  '--------->  '対象セルアドレス: 複数範囲なら","で区切る  adr_input = "B11:B19" '入力範囲(A)  adr_check = "D11:D19,F11:G11" '判定範囲(B~D)  '<---------  On Error Resume Next  '※Dependentsなし時のエラーは不可避なので、  ' 開き直ってエラー全無視の一行処理(テヘ  '入力範囲内のTargetを参照先する判定範囲内のセルを取得  Set rng = Intersect(Intersect(Target, Range(adr_input)).Dependents, Range(adr_check))  On Error GoTo 0  If Not rng Is Nothing Then   '参照先各セルの値が記号と一致するか?   For Each c In rng    Select Case c.Value    '--- 記号: 必要に応じて追加/変更    Case "●", "☆☆", "▼▼▼"     GoTo LB_BEEP '一致したらBeep処理に飛んで終了    End Select   Next  End If  Exit Sub '一致がなければ終了 LB_BEEP:  Beep  '--- 時間稼ぎ: 要調整。環境の影響をどのくらい受けるか不明  For i = 1 To 30000000: Next  Beep End Sub

race77
質問者

お礼

ap_2様 いろいろお世話になりました。心からお礼を申し上げます。

その他の回答 (3)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.3

ふたりとも、Beepでも聞いて落ち着こうぜ。ゆっくり鳴らせば安らぐよ。 Sub beeploop()  Do: Beep: For i = 1 To 1000000000: Next: Loop End Sub 「例では5,99,15,6,35だけど、実際はソレだけじゃない」 なるほど、単純な罠ほどハマる。 ANo.1も、ちゃんと検討した上でのコードだったと思うんだ。 要望通りにB~Dの記号で判定すると、こうなる。   B11に5入力 → D11が●なので鳴る   B12に1入力 → D11が●のままなので鳴る 直前の入力による●か判別が難しい。他の手はないか? B~Dに埋め込んだ関数内で鳴らすのは簡単だけど、   B17に6入力   → D17●ピピ F17☆☆ピピ G17▼▼▼ピピ 6連Beeeeeep。趣旨には沿わない(意味がない)わね。 ・・・ということで、やりたいコトが伝わってもまだ悩ましい。妥協できるならいいけど、もうひと工夫できんか考えたいね。

race77
質問者

お礼

>要望通りにB~Dの記号で判定すると、こうなる。 >  B11に5入力 → D11が●なので鳴る >  B12に1入力 → D11が●のままなので鳴る ap_2様、よく理解できました。 okormazd様があのようにおっしゃられた事もわかりました。 私のイメージは、こうでした。   B11に5入力 → D11が●なので鳴る   B12に1入力 → D11が●のままであるがD12(F12,G12)には●がないため鳴らない だった訳です。 VABの知識がないため okormazd様のコードの意味を理解できませんでした。 okormazd様に「質問者は回答者をからかっている?」と書かれても仕方がないことでした。 >B~Dに埋め込んだ関数内で鳴らすのは簡単だけど、 本当ですか!? D17●ピピ でもよろしいですから、是非教えて下さい。 私の目の鱗が落ちるような素晴らしいレスに心より感謝いたします。

race77
質問者

補足

D17●ピピ F17☆☆ピピ G17▼▼▼ピピ こちらも、よろしくお願いします。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

#1の補足を見たが、何を言っているのかわからない。 説明不足でもなんでもない。 何をやりたいのか、もう1度整理して質問してほしい。 質問の趣旨では、「A列に入力された数値によって、どこでもいいが、関数でもVBAでも何でもいいのだが、●、☆☆、▼▼▼等が出力される、それでBEEPを鳴らしたい」、としかとれない。だったら、「●、☆☆、▼▼▼」は関係ない。「A列に入力された数値」だけによるのだから、#1のコードでいいはずです。 他に何かあるのなら、それを説明してください。 もっとも、「●、☆☆、▼▼▼」の出力でBEEPをすることも簡単にできるが、質問の趣旨からすれば、それをする意味がないでしょう。あるいは、質問者は回答者をからかっている?

race77
質問者

お礼

ap_2様のレスにより 「#1の補足を見たが、何を言っているのかわからない。 説明不足でもなんでもない。」 とokormazd様が書かれたことは正しいようでした。 大変失礼いたしました。

race77
質問者

補足

>説明不足でもなんでもない。 >何をやりたいのか、もう1度整理して質問してほしい。 >だが、●、☆☆、▼▼▼等が出力される、それでBEEPを鳴らしたい」、としかとれない はい、これをやりたいのです。 本当に『説明不足でもなんでもない。』ことでした。 あなたは、私の質問の主旨を既に把握していたからです。 >だったら、「●、☆☆、▼▼▼」は関係ない。「A列に入力された数値」だけによる >のだから、#1のコードでいいはずです。 ここは、やはり説明不足と言わざるを得ません。 私は、質問で 『添付ファイルから申し上げますと ビープ音が鳴る場合としては A列に数値「5」、「99」、「15」、「6」、「35」を入力した際 となります。』 と書きました。 それに対して、okormazd様の回答の中には、 『Select Case Target Case 5, 6, 15, 35, 99』 と書かれています。 これでは、「5」、「99」、「15」、「6」、「35」 の数値しかBEEP音がならないことになります。 実際に打ち込まれる数値は、添付ファイルに書かれている数値だけではありません >もっとも、「●、☆☆、▼▼▼」の出力でBEEPをすることも簡単にできるが、質問の趣旨 >からすれば、それをする意味がないでしょう okormazd様の立場からみれば、「意味がない」と映るようですが、 私はokormazd様の回答文を読み終えた後でも尚「意味ある」という考えです。 しかし、ここで「意味がある」「意味がない」と論じるつもりはありません。 >あるいは、質問者は回答者をからかっている? 何故そのように解釈されるのか、とても不思議に思えます。 私が「回答者をからかって」どんな益があるのでしょう。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

WorkSheetのコードモジュール(たとえば、VBEのウインドウで、左側ペインの「Sheet1」をダブルクリックしてでてくる右側のモジュールの上の「(General)」の右▼をクリックして、「WorkSheet」を選んで、上右の「SelectionChange」などと出ている右▼をクリックして、「Change」を選んで) に下記コード。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub Application.EnableEvents = False Set isect = Intersect(Target, Range("A:A")) If isect Is Nothing Then Application.EnableEvents = True Exit Sub End If Select Case Target Case 5, 6, 15, 35, 99 Beep For i = 1 To 10000 For j = 1 To 2000 Next Next Beep End Select Application.EnableEvents = True End Sub For文の繰り返し回数は、自分のシステムに合わせて適当にする。

race77
質問者

お礼

ありがとうございました。

race77
質問者

補足

okormazd様、ご回答ありがとうございます! 私の質問の仕方がまずかったようです。 Select Case Target Case 5, 6, 15, 35, 99 質問の主旨は ビープ音を鳴らせる要素は、これら「数値」ではなく、この数値によって 各列に組み込まれた関数により判定・識別して表示される 「●」、「☆☆」、「▼▼▼」等の文字のことです。 例えば、添付ファイルの表から申し上げれば 項目【A】の数値5(B11)を入力することによって、項目【B】の文字「●」(D11)の表示に よって、ビープ音が鳴るというしくみです。 たとえ、「●」の他に同時に「☆☆」や「▼▼▼」が表示しても同様です。 説明不足でまことに申し訳ありません。 よろしくお願いします。