Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7177 / 13646 ツリー ←次へ | 前へ→

【40660】ワークシートチェンジイベント(【40409... aaa 06/7/20(木) 9:35 質問[未読]
【40679】Re:ワークシートチェンジイベント(【4040... ひげくま 06/7/20(木) 12:55 発言[未読]
【40683】Re:ワークシートチェンジイベント(【40... aaa 06/7/20(木) 13:39 発言[未読]
【40685】Re:ワークシートチェンジイベント(【40... ひげくま 06/7/20(木) 13:50 発言[未読]
【40715】Re:ワークシートチェンジイベント(【40... aaa 06/7/21(金) 11:08 お礼[未読]

【40660】ワークシートチェンジイベント(【40409...
質問  aaa  - 06/7/20(木) 9:35 -

引用なし
パスワード
   以前に質問させていただいた者です。【40409】
前に教えていただいた時うまくいっていたのですが、ちょっと問題があり改良する必要が出てきましたので再度質問させていただきます。
ワークシートチェンジイベントで、ある特定のセルの値が変更された時にイベント(s_creategraph)が発生するようにしたいと考えています。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim onDate As Variant
  Dim ofDate As Variant
  Dim maxvalue As Variant
    Application.EnableEvents = False
    onDate = Worksheets("Sheet1").Range("B1").Value
    ofDate = Worksheets("Sheet1").Range("D1").Value
    maxvalue = Worksheets("Sheet1").Range("G1").Value
    On Error GoTo End_Len
    With Target
      If onDate = "" Then
        MsgBox "日付を入れてください"
        Worksheets("車室別売上").Range("B1").Activate
        GoTo End_Len
      ElseIf ofDate = "" Then
        MsgBox "日付を入れてください"
        Worksheets("車室別売上").Range("D1").Activate
        GoTo End_Len
      ElseIf onDate > ofDate Then
        MsgBox "正しい日付を入力してください"
        Worksheets("車室別売上").Range("B1").Activate
        GoTo End_Len
      ElseIf maxvalue = "" Then
        MsgBox "最大値を入れてください"
        Worksheets("車室別売上").Range("G1").Activate
        GoTo End_Len
      End If
      s_creategraph
    End With
    On Error GoTo 0
End_Len:
    Application.EnableEvents = True
  End Sub


しかし初期値をそのセルに入れたときにはこのイベントが発生して欲しくないので標準モジュールに

Application.EnableEvents = False
※初期値入力処理
Application.EnableEvents = True

としています。
初期値入力処理のところに、ひとつの標準モジュールにコードを書くとすごく長くなってしまうのでサブルーチン化しています。
サブルーチンごとに上記の「Application.EnableEvents = False」を入れるのはすごく厄介ですし、どこに書いたのかわからなくなってしまいますので、フラグを立ててワークシートチェンジイベントが走らないようにしたいと思っています。
しかし色々調べたのですがフラグを立てる具体的なやり方がわかりません。
テキストには「Boolean型のパブリック変数を定義して初期値にFalseを代入しておき・・・」と書いてありましたが、この方法でサブルーチン内でもその処理が有効になるのでしょうか?

よろしくお願いします。

【40679】Re:ワークシートチェンジイベント(【40...
発言  ひげくま  - 06/7/20(木) 12:55 -

引用なし
パスワード
   ▼aaa さん:
こんにちは。

>ワークシートチェンジイベントで、ある特定のセルの値が変更された時にイベント(s_creategraph)が発生するようにしたいと考えています。
>
>しかし初期値をそのセルに入れたときにはこのイベントが発生して欲しくないので標準モジュールに
>
>Application.EnableEvents = False
>※初期値入力処理
>Application.EnableEvents = True
>
>としています。
>初期値入力処理のところに、ひとつの標準モジュールにコードを書くとすごく長くなってしまうのでサブルーチン化しています。
>サブルーチンごとに上記の「Application.EnableEvents = False」を入れるのはすごく厄介ですし、どこに書いたのかわからなくなってしまいますので、フラグを立ててワークシートチェンジイベントが走らないようにしたいと思っています。

サブルーチンに飛ぶ前に Application.EnableEvents = False を実行して、サブルーチンから戻った後に Application.EnableEvents = True を実行するという方法がありますよ。
そうすれば、サブルーチン内に書く必要はありません。

また、フラグを立てるとしても、サブルーチン内でフラグを判断するのであれば、サブルーチン内で Application.EnableEvents の処理をするよりも厄介だと思うのですが…

aaaさんの質問の意味を私が理解していないかもしれません。
その場合はごめんなさい。

【40683】Re:ワークシートチェンジイベント(【40...
発言  aaa  - 06/7/20(木) 13:39 -

引用なし
パスワード
   ▼ひげくま さん:
こんにちは。

今のところひげくまさんがおっしゃるように

>サブルーチンに飛ぶ前に Application.EnableEvents = False を実行して、サブルーチンから戻った後に Application.EnableEvents = True を実行するという方法がありますよ。

上記の様な処理にしているのですが、これではなぜかたまにワークシートチェンジの方に飛んでしまうことがあったのです。
ですからもしかしたらサブルーチン内にも書く必要があるのかなと思ったのです。

何度も試しているうちにどういう時に変な動きになるのかはわからなくなりましたが、基本的にはこれでいいということですね?
今のところおかしい感じはないです。
処理が遅くなるのがイヤなので、もし余計な処理が入ってしまうと困ると思いました。
お騒がせしました。

【40685】Re:ワークシートチェンジイベント(【40...
発言  ひげくま  - 06/7/20(木) 13:50 -

引用なし
パスワード
   ▼aaa さん:
こんにちは。

>>サブルーチンに飛ぶ前に Application.EnableEvents = False を実行して、サブルーチンから戻った後に Application.EnableEvents = True を実行するという方法がありますよ。
>
>上記の様な処理にしているのですが、これではなぜかたまにワークシートチェンジの方に飛んでしまうことがあったのです。

他の、イベント発生制御をしていないところからも、同じサブルーチンを呼んでいるとかの可能性はありませんか?

>何度も試しているうちにどういう時に変な動きになるのかはわからなくなりましたが、基本的にはこれでいいということですね?

たぶん良いと思いますよ。

【40715】Re:ワークシートチェンジイベント(【40...
お礼  aaa  - 06/7/21(金) 11:08 -

引用なし
パスワード
   ▼ひげくま さん:
こんにちは。
何か他に問題があったのかもしれません。
今のところ動作に問題はありません。
ありがとうございました。

7177 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free