[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォーム上でのイベント無効』(くみこ)
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 これは何でしょうか??? (やっちん)
UserForm1.clearはコンパイルエラーになるでしょう。 よくわかりませんが gflg = True をPrivate Sub CommandButton1_Click()の処理の最後に持ってきてはどうでしょう? 私はTrueとFalseが逆の方がいいと思います。 FormのInitializeイベントでTrueにしてるのでしょうか? (やっちん)
テキストボックスに何か打ち込んだ後にEnterキーを押さずに コマンドボタンを押すと BeforeUpdateイベント Ckickイベント BeforeUpdateイベント の順番で処理が行われます。 2回目のBeforeUpdateイベントはテキストボックスの内容のクリアによるもので 今回のフラグによる対応で処理は行われません。 1回目のBeforeUpdateイベントはテキストボックスの内容に変更があった場合に起こるもので BeforeUpdateイベントを記述しているところから考えると行われるべきものだと思います。 つまり、そこに何の問題もないのではないかと。 問題は予定通りの結果になっているかというところですが、どうなんでしょうか?
フラグの初期値の設定ですがユーザーフォームのActivateイベントで設定するのがいいと思います。 (やっちん)
すいません、間違えていました。 テキストボックスのクリアでBeforeUpdateイベントは呼ばれません。 細かく見ていったところ TextBox1.SetFocusを行ってClickイベントを抜けてから BeforeUpdateイベントが起きているようです。 Clickイベントを抜けてからなのでフラグが意味を持ちません。 TextBox1.SetFocusが無いと2回目のBeforeUpdateイベントが起きないようです。 ブレークポイントを設定すると起きないというのはそういうところに関係があるのかもしれませんね。 振り出しに戻ってしまいました。 (やっちん)
すぐには出てきませんが、他に対処法があるのか少し考えてみますね。 (やっちん)
もう見ていないかもしれませんが解決法を書いておきます。 Clickイベントの中のテキストボックスのクリア処理の前に TextBox1.SetFocusを持ってくる。 この処理の順番がイベントにどう影響しているのかはよくわかっていません(^^;
ただ、1度目のクリックでテキストボックスの内容がクリアされ フォーカスが移った状態で、もう一度コマンドボタンをクリックしたり 別のコントロールにフォーカスを移すとBeforeUpdateイベントが起きます。 入力が無い場合の処理がBeforeUpdateイベントの中に必要でしょうか。 (やっちん)
SetFocusの後にクリアすればよかったんですね。
>入力が無い場合の処理がBeforeUpdateイベントの中に必要でしょうか。
テキストボックス1の入力が無い場合は、テキストボックス2,3など他のテキストボックスを全部クリアするという処理をBeforeUpdateイベントの中に書いています
テキストボックスに何か入力して コマンドボタンを押す。 次にTABキーを押す。 この操作での結果は正しいですか? (やっちん)
最初の頃の2回BeforeUpdateイベントが呼ばれるのと変わらない動きだと思ったのですが、 大丈夫ということなので、いいですね。 (やっちん)
わかりました。ありがとうございました。 (やっちん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.