• ベストアンサー

特定のセルの表示が変わったら音を鳴らしたい!

例えばですが、 BOOK1シートのA1のセルの位置に「テスト」という文字が入ったら音を鳴らしたいんですが、下記でうまくいきません。 音は鳴るんですが、BOOK1のすべてのセルの何かが変われば音が鳴ります、、、 A1のみに対して音を鳴らしたいんです。 皆さん、どうかご教授お願いします! 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) If Cells(A1).Value >= "テスト" Then Shell "mplay32.exe /play /close c:\サウンド\テスト.wav" End Sub

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>Private Sub Worksheet_Change(ByVal Target As Range) 引数 Targetで直前に操作したセル範囲が得られます Private Sub Worksheet_Change(ByVal Target As Range)   With Target     '変化したセルがA1以外ならExit     If .Address <> "$A$1" Then Exit Sub     '変化した値に"テスト"が含まれていなければExit     If Not .Value Like "*テスト*" Then Exit Sub   End With   Shell "mplay32.exe /play /close c:\サウンド\テスト.wav" End Sub

mensgoo
質問者

お礼

watabe007さん、すいません うまく行きました!! イチからやりお直してみたら、あっさりと 凄く嬉しいです、助かりましたし、勉強にもなりました。 感謝感謝です。本当にありがとうございました!

mensgoo
質問者

補足

watabe007さん、回答ありがとうございます。 回答通り、そのままコピーしてやってみたんですが 音が鳴ってくれず、まだ難航中です、、 当方まだまだ勉強はじめたばっかりで、 簡単なことでも、本とGoogleで調べまくらないといけないレベルで、、 とりあえず、再度やってみます!

その他の回答 (3)

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

どのセルの値が変わってもこのルーチンに飛んでくる。 どのセルで変わったかはTargetで教えてくれる。だから If Target.Address="$A$1" Thwn 処理 End If のようにすればよい。(1-約3セルの場合) セル範囲の場合はIntersectを使う。 Googleで「intersect vba」で照会のこと。

mensgoo
質問者

お礼

imogasiさん、回答ありがとうございます。 もう一歩って感じなんですが、 まだうまくいっておらず、、、 でも頑張って鳴らしてみます!

回答No.2

>If Cells(A1).Value >= "テスト"・・・ Likeをつかってみては? http://www.red.oit-net.jp/tatsuya/vb/string.htm#Like

mensgoo
質問者

補足

cistronezkさん、回答ありがとうございます。 URL参考にしています。 ※当方、まだまだ未熟者レベルで、難航中ですが 頑張って鳴らしたいと思います!

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

Changeイベントの引数Targetに「どのセルが変化したか」の情報が入ります Private Sub Worksheet_Change(ByVal Target As Range)  ' A1セルが変化したときのみ処理を行う  If Target.Address = "$A$1" Then ' Target = Range("A1") でもいいかも?   ' セルの内容が"テスト"だったら音を鳴らす   If Target.Value = "テスト" Then    ' 音を鳴らす処理   End If  End If End Sub

mensgoo
質問者

補足

Trick--o--さん、回答ありがとうございます。 早速やってるんですが、まだうまく行かず 難航中です、、、 でも凄く参考になっています!感謝ですッ

関連するQ&A

  • 別々のセルで音を鳴らせる設定

    皆さん、すいません、4つ下ぐらいのところで質問をした者ですが、 もう一つだけご教授ください。 先ほどは、 BOOK1の中で セルA1にテストという文字が入ったらテスト.wavが鳴る というものをしたくて教えてもらって、うまくいったのですが、 本当にやりたいのは下記のようなことなんです。 ※一つ教えてもらったら、応用していけると思ったんですが、力不足、知識不足で無理でした、、 BOOK1の中で セルA1にテストという文字が入ったらテスト.wavが鳴る セルA2にトマトという文字が入ったらトマト.wavが鳴る セルA3にバナナという文字が入ったらバナナ.wavが鳴る セルA4にブドウという文字が入ったらブドウ.wavが鳴る ご教授できましたら、お願いします。 ----------↓先ほど教えてもらったものです↓--------- (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 '変化したセルがA1以外ならExit If .Address <> "$A$1" Then Exit Sub '変化した値に"テスト"が含まれていなければExit If Not .Value Like "*テスト*" Then Exit Sub End With Shell "mplay32.exe /play /close c:\サウンド\テスト.wav" End Sub

  • Excel VBA 一定の数値以下で音を鳴らす

    一つのセル内の数値(VBAにより、1秒ごとに更新される流動的な数値です)において、-2以下になるとすぐにBEEP音が鳴る設定をしたいのですが、何故か1分ごとにしか鳴りません。 今のモジュールは、標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Sheet1に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Range("Q6") < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub と入力しています。 改善方法をどうかご教授願います。

  • Excel:列中に特定の文字列を表示するセルが出たらBeep音を鳴らす

    商品の品番の確認作業にエクセルを使っています。 作業の効率化にエクセルVBAを使いたいのですが、うまくいきません。 具体的な使用目的は以下の通りです。  納品された商品には製造メーカーのバーコードがついています。それをエクセルに読み込んで予定通りの商品であるか確認作業を行います。  まず、エクセルシートのA列にメーカーコードを入力しておきます、B列のセルをアクティブにした状態でメーカーのバーコードを読み取ります。するとセルにメーカーコードが自動入力されます。この文字列がA列の文字列と一致した場合にはC列のセルにOKの文字が出るように設定しています。コードが一致しない場合はNGが出ます。  現在はOKかNGかを目で確認しているのですが、商品数が多いので、NGの場合にBeep音が出るようになっていれば作業が早くなります。  過去の質問例を調べて、VBAのAMI関数を使うとBeep音を鳴らせることはわかりました。たとえば、セルC1にNGと表示された場合にBeep音を鳴らす、というところまではできたのですが、列CのいずれかのセルにNGと表示された場合にBeep音を鳴らす、という設定ができません。  わかる方アドバイスお願いします。  ちなみに、セルC1にNGと表示された場合にBeep音を鳴らすには以下のように設定しました。 標準モジュール Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long シートのモジュール Private Sub Worksheet_Change(ByVal Target As Range) If Range("C1") = "NG" Then Call Beep(2000, 500) End If End Sub

  • BEEP音を再生したい

    下のドレミを再生したいのですが具体的にどのようにどこへ記載すれば再生できますか? Private Sub? Declare Function Beep Lib "kernel32" ( _           ByVal dwFreq As Long, _           ByVal dwDuration As Long _           ) As Long 上記のコードをSUB に記載するとエラーになります。 これがないとCALL Beepもエラーになります。 '=============================== Sub Test()  Call Beep(262, 500)  Call Beep(294, 500)  Call Beep(330, 500)  Call Beep(349, 500)  Call Beep(392, 500)  Call Beep(440, 500)  Call Beep(494, 500)  Call Beep(523, 500) End Sub VBA初心者です分かりやすくお願いします。

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

    こちらで、ご教授してもらったものを使わせて頂いているのですが、 どうしてもうまくいかないことが出て、行き詰まってしまい、、、 皆さん、度々すいませんが手助けできましたらお願いします。 エクセルのセルの結果表示のところで、 在庫追加となったら音がなるようにしたいのですが、 手打ち(コピペなど)で結果表示の所に (例えば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

  • VBAにおけるセルの名前の参照方法

    現在、Aシート、Bシートがあり、BシートのA1セルに test という名前を付けました。(範囲はブック) Aシートが再計算されれば、BシートのA1セルをメッセージボックスで表示したいのですが、調べましたが、よくわかりませんでしたので、詳しい方教えてください。 範囲はブックになっているし、他に同じセルの名前もつけれないようになっているので、 このような記述で大丈夫かと思いましたがエラーが出でしまいました。 なぜでしょうか?やはりわざわざ毎回シート名から記述が必要なのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Range("test").Value) End Sub このようにシート名から書けば表示されました。 Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Worksheets("B").Range("test").Value) End Sub

  • VBAでのカーソル移動とマウスクリック

    業務上の単純作業の自動化のため、VBAから他のアプリケーションを操作することが目的です。 以前、ブラウザ上での作業の時に使用した、下記2つのAPIでは今回はマウスカーソルが指定した座標に動いてくれません、、、 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) この2つのAPI以外で、カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? 色々な方法を教えていただけるとVBAの勉強にもなり幸いです。 ' // 標準モジュール Option Explicit Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI     x As Long     y As Long End Type Private Sub クリックテスト() Call SetCursorPos(216, 421) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) Call mouse_event(&H4, 0, 0, 0, 0) End Sub

  • ExcelVBAでのkernel32(64bit)

    今までExcel2000のVBAから、以下のようなコードを使ってC++で作ったコマンドプロンプトで動くプログラムを動かすプログラムを作っていましたが、これを64bitのWindows7上で動いているExcel2010で使おうとしたらメッセージが出ました。いろいろ調べてみたところ、たぶんDeclareにPtrSafeを付ければ良いようなのですが、その際、他のコードはそのままで良いのでしょうか。特に、コード中のLongはそのままで良いのか気になるのですが...。ちなみに、下記コードの条件コンパイルはネットで調べて見よう見まねで付けたもので、Excel2000のときには付けていないものでした。ご存じの方がいらっしゃいましたらご教授ください。 '------------------------------------------------------------------------------ ' Win32 API関数・定数の宣言 '------------------------------------------------------------------------------ #If VBA7 And Win64 Then '64bit Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #Else '32bit Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #End If Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private Const INFINITE As Long = &HFFFF '------------------------------------------------------------------------------ ' Run '------------------------------------------------------------------------------ Public Sub Run(ByVal project_name As String)   Dim program As String   Dim task_id As Long   Dim h_proc As Variant   program = mdlFunc.ProgramPath() & mdlFunc.ProgramOption(project_name) 'プログラム名   task_id = Shell(program, vbHide)   h_proc = OpenProcess(PROCESS_ALL_ACCESS, False, task_id)   If OpenProcess(PROCESS_ALL_ACCESS, False, task_id) <> vbNull Then     Call WaitForSingleObject(h_proc, INFINITE)     CloseHandle h_proc   End If End Sub

  • エクセルVBA セルの入力後「Delete」キーを押したか判断するプログラム

    セルに入力したあとその入力したキーが「Delete」キーかどうか判定するプログラムを作りたいのですが、下記のようにコードを書きました。 '標準モジュール Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long 'Microsoft Excel Objects(ワークシート) Private Sub Worksheet_Change(ByVal Target As Range) If GetAsyncKeyState(46) <> 0 Then 'キーボードの「Delete」キーかどうか判定 ○○ Else ○○ End If End Sub ところが、「Delete」キーを押してもGetAsyncKeyState(46)の値が「0」になり、「Delete」キーを押してないことになってしまいます。どのようにすればよいのでしょうか? 回答よろしくお願いします。

  • Beep音を出すには?

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'Beep音を出す Dim I As Integer For I = 1 To 100 ' Loop 100 times. Beep() ' Sound a tone. Next I End Sub 上記のコードでBeep音を出したいのですが、鳴りません。 (Beepコードは、VBのサンプルコードです。) OS:WinXP SP3 VB.NET Ver2003です。 フォームにコマンドボタンを一つ貼り付け、 コマンドボタンのクリックイベントで Beep音を鳴らしたいです。 PCのデバイスマネージャ設定は、 Beep音が有効になっています。 他の音(Win立上音他)は、デフォルトのままです。 詳しい方、教えて下さい。

専門家に質問してみよう