[[20080812191101]] 『再 ユーザーフォームでの入力チェックのやり方』(ヒロ) ページの最後に飛ぶ

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

 

『再 ユーザーフォームでの入力チェックのやり方』(ヒロ)
 Excel2000 WindowsXP

 いつもお世話になっております。
 EXITの時の処理ですが、以前解決したように見えて、
 今になって、新たに問題が発生しましたので再度宜しくお願いします。

 フォームに、テキストボックスが複数あります。
 入力チェックは、ボタン押下時ではなく、
 それぞれのテキストボックスから、フォーカスが移動しようとしているときに行いたいのです。
 これだけなら、EXITイベントで解決しますが、
 終了ボタン(CommandButton)を配置して、
 ボタン押下時に入力チェックがかからないようにしたいのですが、
 どうしたらよろしいでしょうか?

 問題は、EXITイベント時に、終了ボタンが押されたのかどうかを判定できるか?
 ということなのですが、いろいろやってみましたが、うまくいきません><
 良い知恵は無いでしょうか?

 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

 >>>>ココで判定可能なのか?

     If TextBox1.Text = "" Then
         MsgBox ("テキストボックス1が未入力です")
         Cancel = True
     End If
 End Sub


[[20080722185201]] 

 ↑これの続きですね?

 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

 >>>>ココで判定可能なのか?

 無理です。VBのLostfocusイベントとは違いますねえ!!
 新たなイベントでも考えなければなりません(ActiveControlを監視する方法)が、
 作ったことはありますが、実務では未だ採用する自信がありません。

 Exitイベントは、扱いが本当に難しいのです。
 Exitイベントでどこのコントロールから抜けたのかというフラグを立てて、フォーカスの移動先の
 コントロールのEnterイベントでチェックする なんて方法も考えましたが、簡単なテストでは
 うまくいったように見えてもこれにも色々問題があって、うまくはいきませんでした。

 >終了ボタン(CommandButton)を配置して、
 >ボタン押下時に入力チェックがかからないようにしたいのですが、
 >どうしたらよろしいでしょうか?

 1.

 前回の投稿で述べたようにエラーメッセージはMsgboxではなく、ラベル表示にして、しかも警告のみにして
 実行時に本格的にエラーにする方法(私は、ほとんどこれ)。

 2.
 終了ボタンはなし(ユーザーフォームのXボタンで終了する仕様する)にして

 標準モジュール

 Sub test()
   UserForm1.Show
   With UserForm1
      .TextBox1.Text = "エラーにならないように文字をいれる"
      End With
   Unload UserForm1
 End Sub

 Userform1では、

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   If CloseMode = 0 Then
      Cancel = True
      Me.Hide
      End If
 End Sub
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

 '>>>>ココで判定可能なのか?

     If TextBox1.Text = "" Then
         MsgBox ("テキストボックス1が未入力です")
         Cancel = True
     End If
 End Sub

 こんなコードでTextbox1が未入力でXボタンクリックでエラーが表示されません。

 これでも嫌なら、監視プログラムですが・・・。

 検討してみてください。

 ichinose


 はい、あれの続きです^^;
 何度もすみません><;

 前回なぜ、うまくいった! と思っていたのかと言うと、
 テキストボックス群は全てフレーム内にあり、コマンドボタン群はフレームの外にあったんです。
 で、フレーム内のテキストボックスから、フレーム外のコマンドボタンにフォーカスが移ると、
 Exitイベントが発生しなかったんですね。
 しかし、コマンドボタン(更新実行)押下時にチェックをかけて、
 元のテキストボックス以外のテキストボックスにフォーカスを移そうとしたとき、
 Exitイベント発生となり、2重チェックがかかったり、エラーとなってしまったんです。
 (もとのテキストボックスもエラーになる条件下で)
 それで、今回の問題が発生したと言うわけです><

 Exitイベントは便利なようで、なかなか扱いにくいのですね^^;

 1の、警告表示にして、実行時に本格的にエラーにする方法を取りたいと思います。
 Exitイベント内で判定が不可能と知り、残念ではありますが、
 ichinoseさんのおかげで、疑問が晴れて頭がすっきりしました。
 これで、心置きなくコーディングに専念で来ます^^

 本当に、親切に教えていただきありがとうございました。
 今後とも、よろしくご指導お願いいたします。

 解決後ですし、だいぶ日にちが経ってしまいましたが、気になったので・・・。

 >前回なぜ、うまくいった! と思っていたのかと言うと、

 そうすねえ、解決時にはその解決された方法を記述して頂けるとこの御質問がFAQ
 として、利用しやすいですねえ!!

 >テキストボックス群は全てフレーム内にあり、コマンドボタン群はフレームの外にあったんです。
 ↑これもバグです。
 フレーム内の文字入力可能なコントロール(テキストボックスやコンボボックス等)
 マルチページ内の文字入力可能なコントロール
 の組合せは、Exitイベントの発生にバグがあります。

 詳しくは、

http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips03.htm

 以前、このバグを逆利用してコード作成を・・・、なんて試みたことがありましたが、
 とんでもないことになってしまい、結局一日無駄にしてしまったことがありました。

 この投稿をご覧になることがありましたら、リンクサイトを参考にしてみてください。

 ichinose@もう仕事だあ


 なんとなく気になって見にきたらコメントが^^

 なるほど、バグなんですねぇ・・・・
 お仕事の合間にもかかわらず、ありがとうございました。
 見にきてよかった^^

 (ヒロ)

コメント返信:

[ 一覧(最新更新順) ]


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