『VBA関係』(VBA初心者) セルA1=1なら”おはよう”、2なら”こんにちわ”、3なら”こんばんわ” とメッセージボックスをA1の数値が変わった時だけ自動的に出したいのですが・・・ どうコードを記述したら出来ますか? あとコードを記述するところの上のGeneralとかDeclarationsとかの欄はどれを選べばいいですか? ---- こんなことですか? (Hatch) Private Sub Worksheet_Change(ByVal Target As Range) Dim x As Variant If Target.Address() <> "$A$1" Then Exit Sub x = Array("おはよう", "こんにちわ", "こんばんわ") If Target.Value = 1 Or Target.Value = 2 Or Target.Value = 3 Then MsgBox x(Target.Value - 1) Else MsgBox "1,2,3以外が入力されました" End If End Sub ---- 衝突です。。。書いちゃいます・・・ Sheet1のセルA1が対象で、Sheet1にコードが書き込める状態にあると思っての回答です。 >GeneralとかDeclarationsとかの欄はどれを選べばいいですか? WorksheetとChangeを選び、Option Explicit(表示されていなければ無視)以外を全て消し下記を記入してください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Select Case Target.Value Case 1: MsgBox "おはよう" Case 2: MsgBox "こんにちわ" Case 3: MsgBox "こんばんは" End Select End If End Sub (1or8) ---- Hatchさん・1or8さん ありがとうございます。 Worksheet Changeにして コードはコピペして貼り付けたんですがメッセージボックスでないです。 なんででしょうかね? お二方の両方ともなんで僕のやり方に問題があると思うのですが・・・ (VBA初心者) ---- ちょっと勘違い・・・ コピペならGeneralのままでもいいです。 WorksheetとChangeを選ぶと Private Sub Worksheet_Change(ByVal Target As Range) End Sub こんなのが自動的に表示されます。 通常、ここにコードを書き込むのが流れです。 >コードはコピペして貼り付けたんですがメッセージボックスでないです。 >なんででしょうかね? エクセルの\Sheet1/を右クリックし、コードを表示を選択するとコードを記入するウインドウが表示されます。 ここに記入しましたか? (1or8) ---- 1or8さん 僕の手順でいきますと @\Sheet1/を右クリックし、コードを表示を選択するとコードを記入するウインドウが表示 AWorksheetとChangeを選ぶ。 BPrivate Sub 〜 End Subの間にif 〜 End ifのコードを貼り付けました。 《こんな感じです》 Private Sub Worksheet_Change(ByVal Target As Range)     If Target.Address = "$A$1" Then ←ここから      :           ・     End If←ここまでをコピペしています。  End Sub これだとダメですか? (VBA初心者) ---- あってますね・・・ 一度、下記を実行してから、再度試してみて下さい。 (1or8) Sub test() Application.EnableEvents = True End Sub ---- 1or8さん ありがとうございます! メッセージボックス出ました! 勉強の為、教えてください。 何が原因ですか? (VBA初心者) ---- 過去のマクロの実行の中で、何らかの原因により Application.EnableEvents = False となっていたようです。 これでは Changeイベントが実行されません。 = True にしてイベントの実行を許可させたということです。 (1or8) ---- 1or8さん ありがとうございます。 Application.EnableEvents = False というのはどこかのプロパティか何かで確認できるのですか? それとも素人が見れない部分のプログラムか何かですか? (VBA初心者) ---- いえ、コードの一部で別のマクロで Application.EnableEvents = False を実行し、True に戻さなかっただけだと思います。 Sub macro() Application.EnableEvents = False 〜処理〜 Application.EnableEvents = True end sub のようにして使います。 おそらく、〜処理〜でエラーで止まり、False のまま放置されていたものと推測されます。 (1or8) ---- 1or8さん ありがとうございます。 もう少し教えてください。 A1に直接入力ならメッセージボックスが出るのですが、数式で1とか2を出した場合は メッセージボックスが出ないのです。 コードのどこをどう直せばメッセージボックスは出ますか? あと・・・ ブック上でApplication.EnableEvents のコードをどこ見ても見あたらないのですが、 過去に別のブックで作成したマクロとかの影響とかも考えられるのでしょうか? このブックだけでしか影響範囲が無いなら、該当コードが見あたらないのです。 説明されてる意味は判るのですが、いつの間にそんな事をしてしまったのかが判らず、 またやっちゃいそうなので原因を突き止めたくて・・・ お手を煩わせてすいません(^^;) (VBA初心者) ---- >数式で1とか2を出した場合 Worksheet_Change ではなくて Worksheet_Calculate に変更してみてください。 Private Sub Worksheet_Calculate() Select Case Range("a1").Value Case 1: MsgBox "おはよう" Case 2: MsgBox "こんにちわ" Case 3: MsgBox "こんばんは" End Select End Sub >コードをどこ見ても見あたらないのですが 別のブックで実行されたのでしょう。 ブックが異なっていてもイベントの定義は残っています。 (1or8) ---- Worksheet_xxxx イベントはシートに何らかの変化が生じた場合に実行されます。 私もたまに、あれ?動かん!とやってしまいます。 その場合、上記3行マクロを実行します。 気楽に考え、チェンジイベントを使用して動かなければ試せばいいかと思います。 あくまでも個人的な考えです。 (1or8) ---- 1or8さん ありがとございます。 かなり勉強になりました。 めちゃめちゃ嬉しいです!! 今、応用で別件の表に試してみたら思うようにいきました! 親切丁寧に教えていただいて感謝感激です(^^) ありがとうございました。 もっとこれからも深く勉強していき活用していけたらと思っています。 今後、またお世話になるかもしれませんが、その時はまた宜しくお願いいたします。 本当にありがとうございました。 (VBA初心者) ---- 1or8さん、A1に影響ない計算の場合にも動いてしまいませんか。。?   σ(^-^;)はこんなことかと思いました。   Private oldval As Variant Private Sub Worksheet_Activate() oldval = Range("A1").Value End Sub Private Sub Worksheet_Calculate() With Range("A1") If .Value <> oldval Then oldval = .Value Select Case .Value Case 1: MsgBox "おはよう" Case 2: MsgBox "こんにちは" Case 3: MsgBox "こんばんは" End Select End If End With End Sub   (ROUGE) ---- >A1に影響ない計算の場合にも動いてしまいませんか。。? 確かにそうですね! このままでは、メッセージボックスが表示されないだけで、イベントは全セルで有効ですね^^; ご指摘、ありがとうございます。 (1or8) ----  ROUGEさん ありがとうございます! 応用して使ってたら他のセルに入力する度に実行されるのでA1の数値に変化があった時だけに したいと今、1or8さんに再度教えていただこうと思っていたとこなんです(^^;) すいません教えてください。 Private oldval As Variant Private Sub Worksheet_Activate() oldval = Range("A1").Value End Sub 上記のコードの部分ですが、Private Sub Worksheet_Calculate()の上に記述するだけでいいのですか? あと、シートもシート1だけに限定したいんです。 他のシートで仕事してたらメッセージボックスが出てくるのでビックリしました (^^;) (VBA初心者) ---- 私のロジックは、そのシートがアクティブになったときに、A1のセルの内容を変数に放り込んで、変化があったときにメッセージが出るというものです。 数式が他のシートと連動しているような場合には一工夫必要ですね。(ROUGE)   Private oldval As Variant Private flg As Boolean Private Sub Worksheet_Activate() flg = True oldval = Range("A1").Value End Sub Private Sub Worksheet_Deactivate() flg = False End Sub Private Sub Worksheet_Calculate() If Not flg Then Exit Sub With Range("A1") If .Value <> oldval Then oldval = .Value Select Case .Value Case 1: MsgBox "おはよう" Case 2: MsgBox "こんにちは" Case 3: MsgBox "こんばんは" End Select End If End With End Sub ---- ROUGEさん すいません・・・ シート1と他シートとは数式は連動していないです。 連動していないけれども、他シートのセル(どこでも)に何か入力するとメッセージボックスが 出てきちゃいます(^^;) 《現在応用で作成しているコード》 Private oldval As Variant Private flg As Boolean Private Sub Worksheet_Activate() flg = True oldval = Range("e148").Value End Sub Private Sub Worksheet_Deactivate() flg = False End Sub Private Sub Worksheet_Calculate() num = Range("e148") Select Case num Case 1 ans = MsgBox("初期教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("お疲れ様です!", vbOKOnly) If ans = vbOK Then ans = MsgBox("ナレッジレベル1です!") If ans = vbNo Then Range("F141").Value = 0 Case 2 ans = MsgBox("オートセットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("オートセットは自動でセットができますが、確認するのは人間だという事を忘れないでくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、オートセットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、オートセット時の注意点は説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル2です!") If ans = vbNo Then Range("H141").Value = 0 Case 3 ans = MsgBox("手動セットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("手動セットは繰り返し経験を積む事で実力がついてきますので、頑張ってくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、手動セットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、手動セット時の注意点は説明できますか?)", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル3です!") If ans = vbNo Then Range("H141").Value = 1 End Select End Sub 現状はシート1に限らず他シートでも、どこのセルを変動させても、シート1のセルE148が1になっていれば、1に該当するメッセージボックスが出てきます。 シート1のセルE148の数値が変動した時のみメッセージボックスを開きたいんです。 (VBA初心者) ---- ん?さっきアップした方の Private Sub Worksheet_Calculate() の直下の一文が上のコードに見当たりませんが? (ROUGE) ---- ROUGEさん If Not flg Then Exit Sub  ↑これですよね? これいれるとE148が変動してもメッセージボックスが出なくなるんです。 なにか他にも僕のコード上で抜けてるんですかね・・・ もしかしたら抜けてる何かを入れるとIf Not flg Then Exit Subが活きてくるのですかね? (VBA初心者) ---- 入れた後、一度別のシートに移動してから元のシートに戻ってみてください。(ROUGE) ---- ROUGEさん ありがとうございます。 別シートでメッセージボックスは出なくなりました! ただこのセルE148があるシートだけはどのセルの数値を変動させてもメッセージボックスが出てきます・・・ E148が変動した時だけメッセージボックスを出したいんですが、僕の記述でなにかまだ抜けていますか? どこをどう直せばセルE148が変動したときだけ実行されるようになりますか? 《現在のコード》 Private oldval As Variant Private flg As Boolean Private Sub Worksheet_Activate() flg = True oldval = Range("e148").Value End Sub Private Sub Worksheet_Deactivate() flg = False End Sub Private Sub Worksheet_Calculate() If Not flg Then Exit Sub num = Range("e148") Select Case num Case 1 ans = MsgBox("初期教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("お疲れ様です!", vbOKOnly) If ans = vbOK Then ans = MsgBox("ナレッジレベル1です!") If ans = vbNo Then Range("F141").Value = 0 Case 2 ans = MsgBox("オートセットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("オートセットは自動でセットができますが、確認するのは人間だという事を忘れないでくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、オートセットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、オートセット時の注意点は説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル2です!") If ans = vbNo Then Range("H141").Value = 0 Case 3 ans = MsgBox("手動セットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("手動セットは繰り返し経験を積む事で実力がついてきますので、頑張ってくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、手動セットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、手動セット時の注意点は説明できますか?)", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル3です!") If ans = vbNo Then Range("H141").Value = 1 End Select End Sub (VBA初心者) ---- Calculateイベントで、oldvalが使われていませんね。 私の提示したものではoldvalで判定を行っています。 そこを考慮して見直ししてみてください。 (ROUGE) ---- ROUGEさん ありがとうございます☆ 下記のように直したら希望どおり出来ました! でも、If Not 〜 oldval = .Valueまではどう読んだらいいのでしょうか? 勉強のため教えていただけませんでしょうか(^^;) Private Sub Worksheet_Calculate() If Not flg Then Exit Sub With Range("e148") If .Value <> oldval Then oldval = .Value Select Case .Value Case 1 ans = MsgBox("初期教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("お疲れ様です!", vbOKOnly) If ans = vbOK Then ans = MsgBox("ナレッジレベル1です!") If ans = vbNo Then Range("F141").Value = 0 Case 2 ans = MsgBox("オートセットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("オートセットは自動でセットができますが、確認するのは人間だという事を忘れないでくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、オートセットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、オートセット時の注意点は説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル2です!") If ans = vbNo Then Range("H141").Value = 0 Case 3 ans = MsgBox("手動セットの手順の教育を受けましたか?", vbYesNo) If ans = vbYes Then ans = MsgBox("手動セットは繰り返し経験を積む事で実力がついてきますので、頑張ってくださいね!", vbOKOnly) If ans = vbOK Then ans = MsgBox("では、手動セットの手順を説明できますか?", vbYesNo) If ans = vbYes Then ans = MsgBox("最後に、手動セット時の注意点は説明できますか?)", vbYesNo) If ans = vbYes Then ans = MsgBox("ナレッジレベル3です!") If ans = vbNo Then Range("H141").Value = 1 End Select End If End With End Sub (VBA初心者)