[[20090918090713]] 『VBA関係』(VBA初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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初心者)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.