[[20060220135926]] 『フォーム上でのイベント無効』(くみこ) ページの最後に飛ぶ

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

 

『フォーム上でのイベント無効』(くみこ)
 UserForm上のTextBox1にBeforeUpdateイベントの処理を記述しています。
 CommandButton1のClick時、マクロ内でTextBox1をクリアするときに
 こちらのBeforeUpdateイベントの処理が走ってしまいます。
 普通のワークシート上のイベントを無効にする
 
 Application.EnableEvents = False
 
 を記述しても うまくいきません。
 UserForm上のイベントを無効にするには どうすればよいでしょうか


 自分でフラグを作って処理を行うようにします。
 BeforeUpdateイベントのコードの先頭でフラグがTRUEのときに処理をしないということにすると、
 CommandButton1のClickイベントのコードの流れは
 1.フラグをTrueにする。
 2.TextBox1をクリアする。
 3.フラグをFalseにする。
 になります。
 フラグは複数のモジュールで使えるようにモジュールの外側に記述します。
 (やっちん)

 回答ありがとうございました。
 ただ上記のように記載したのですが、
 BeforeUpdateイベント内の処理が実行されてしまうようです。
 しかし、本当にクリアしているところで走っているのか
 Clickイベント内でブレークポイントを置きながら実行したところ
 ブレークポイントを設定すると
 BeforeUpdateイベント内の処理は呼ばれていませんでした。
 また、デバックしようとClickイベント内にMsgBoxを途中でいれたりすると、
 同じようにBeforeUpdateイベント内の処理は呼ばれないのですが
 ブレークポイントもMsgBoxもClickイベント内に記載しないと
 BeforeUpdateイベント内の処理は実行されてしまうようです。


 私のところではうまくいきますよ。
 コードを載せてもらえませんか?
 イベントのデバッグにはMsgboxよりDebug.Printを使ったほうがいいですよ。
 処理の流れを邪魔しないですし。
 (やっちん)

 コードを乗せます
 下記のようにすると ボタンをClickしても
 "発生" というメッセージがでてしまいます。
 ただ、ブレークポイントを途中にいれておくと
 ボタンをClickしても出なくなります

 Private Sub CommandButton1_Click()

    If Len(UserForm1.TextBox1) > 0 Then

	・・・

        Application.EnableEvents = False
        gflg = False
 UserForm1.clear
        gflg = True
        Application.EnableEvents = True

        ThisWorkbook.Save
        UserForm1.TextBox1.SetFocus

    End If

 End Sub

 Private Sub TextBox1_BeforeUpdate(ByVal Cancel _
                                    As MSForms.ReturnBoolean)

    If gflg = True Then
	MsgBox "発生"
	・・・

    End If

 End Sub

 >UserForm1.clear
 これは何でしょうか???
 (やっちん)

もともとはそこに
UserForm内のテキストボックスを全部クリアする処理をそこに書いていましたが
それだと BeforeUpdateイベントが走ってしまっていたので
UserForm1.clearという処理に変えて見ました。
でもやっぱりだめでしたので、そこはテキストボックスをクリアする処理が入っている
のと同じ状態です


 UserForm1.clearはコンパイルエラーになるでしょう。
 よくわかりませんが
 gflg = True
 をPrivate Sub CommandButton1_Click()の処理の最後に持ってきてはどうでしょう?
 私はTrueとFalseが逆の方がいいと思います。
 FormのInitializeイベントでTrueにしてるのでしょうか?
 (やっちん)

 テキストボックスに何か打ち込んだ後にEnterキーを押さずに
 コマンドボタンを押すと
 BeforeUpdateイベント
 Ckickイベント
 BeforeUpdateイベント
 の順番で処理が行われます。
 2回目のBeforeUpdateイベントはテキストボックスの内容のクリアによるもので
 今回のフラグによる対応で処理は行われません。
 1回目のBeforeUpdateイベントはテキストボックスの内容に変更があった場合に起こるもので
 BeforeUpdateイベントを記述しているところから考えると行われるべきものだと思います。
 つまり、そこに何の問題もないのではないかと。
 問題は予定通りの結果になっているかというところですが、どうなんでしょうか?

 フラグの初期値の設定ですがユーザーフォームのActivateイベントで設定するのがいいと思います。
 (やっちん)

回答どうもありがとうございます
ユーザーフォームのActivateイベントでフラグの初期化も行っています
ただどうしても うまくいきません。
ただし、デバックするのにブレークポイントを設定すると
呼ばれなくなるので、ブレークポイントを設定しないと
呼ばれるというよくわからない現象になっていますので
もしかしたら単純にプログラムの記述の問題じゃないのかもしれません。
いろいろと回答ありがとうございました。


 すいません、間違えていました。
 テキストボックスのクリアでBeforeUpdateイベントは呼ばれません。
 細かく見ていったところ
 TextBox1.SetFocusを行ってClickイベントを抜けてから
 BeforeUpdateイベントが起きているようです。
 Clickイベントを抜けてからなのでフラグが意味を持ちません。
 TextBox1.SetFocusが無いと2回目のBeforeUpdateイベントが起きないようです。
 ブレークポイントを設定すると起きないというのはそういうところに関係があるのかもしれませんね。
 振り出しに戻ってしまいました。
 (やっちん)

回答ありがとうございました。
そういうことだったのですね。原因がわかり助かりました。
setFocusするかも含め最初から見直して見ます
どうもありがとうございました


 すぐには出てきませんが、他に対処法があるのか少し考えてみますね。
 (やっちん)

本当にいろいろありがとうございました。
Click処理終了後、フォームの中の一番先頭のテキストボックスに
フォーカスをあてたかっただけなのですが
setFocusがよくなさそうですのでsetFocusをやめて
Clickイベントの最後で
UserForm1をUnloadして、再びloadしてshowするというように
変えたところ、BeforeUpdateイベントは走らず、
また先頭のテキストボックスにフォーカスもあたるようになりました。
原因をみつけてくださって 大変助かりました。どうもありがとうございました

 もう見ていないかもしれませんが解決法を書いておきます。
 Clickイベントの中のテキストボックスのクリア処理の前に
 TextBox1.SetFocusを持ってくる。
 この処理の順番がイベントにどう影響しているのかはよくわかっていません(^^;

 ただ、1度目のクリックでテキストボックスの内容がクリアされ
 フォーカスが移った状態で、もう一度コマンドボタンをクリックしたり
 別のコントロールにフォーカスを移すとBeforeUpdateイベントが起きます。
 入力が無い場合の処理がBeforeUpdateイベントの中に必要でしょうか。
  (やっちん)

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

SetFocusの後にクリアすればよかったんですね。

>入力が無い場合の処理がBeforeUpdateイベントの中に必要でしょうか。

テキストボックス1の入力が無い場合は、テキストボックス2,3など他のテキストボックスを全部クリアするという処理をBeforeUpdateイベントの中に書いています


 テキストボックスに何か入力して
 コマンドボタンを押す。
 次にTABキーを押す。
 この操作での結果は正しいですか?
 (やっちん)

はい。大丈夫そうです。


 最初の頃の2回BeforeUpdateイベントが呼ばれるのと変わらない動きだと思ったのですが、
 大丈夫ということなので、いいですね。
 (やっちん)

はい。実はBeforeUpdateイベントが2回はしると困るというよりは
ときどき Enterがきかなくなったりする現象がおきて、
いろいろとさぐっていて もしかしたらBeforeUpdateイベントが2回よばれていることで
何か不具合を起こしているのかと思いました。
そのあたりも解決しましたので大丈夫です

 わかりました。ありがとうございました。
 (やっちん)

コメント返信:

[ 一覧(最新更新順) ]


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