|
▼年寄り さん:
おはようございます。
>ちょいとダウンしていた。『臭いメシ』ならぬ『不味いメシ』を食わされていた。ノートは持って行ったが、病室ではインターネットが使えない。応答に遅れて大変申し訳ない。とても気になっていた。
急に寒くなってきましたからねえ・・・。
なにせ、本日夕方から子供スケート教室の付き添いです。もう、冬ですね!!
お大事に!!
>
>質問1
>UserFormに直接貼り付けたTextBoxコントロールのイベントと、Classモジュールで今回作成したf_txtというTextbox(Msforms.Textbox)のイベントに違いがあります。Textbox(Msforms.Textbox)のイベントの方が少ない。何故ですか?
はい、おっしゃるとおりです。
特にEnter、Exit、Update(Before,After)とありませんよね?
本当の理由は私もわかりませんが、風の噂ではコンパイラー言語VBとの
格差だとか・・・。
これがあるので私は、Keydownというイベントにてデータチェックを行っている
場合が多いのですが・・・。
UserformのプロパティにActivecontrolというプロパティがあります。
このプロパティでアクティブになっている(フォーカスを持っている)コントロールが
取得できます。このプロパティの中身を監視して変化があったらイベントを発生させる
という手法が考えられますし、私もだいぶ前にそんなコードを見たことがあります。
(Excel2000からは、独自のイベントが作成できますからね)
汎用的に作るには、時間かかるかなあ・・(実用的か否かの検証も大変そう)。
角田さん、作ってないですかあ?
>
>質問2
>TextBoxコントロールのイベントAfterUpdateとBeforUpdateの区別がはっきりしません。後者がキャンセルを判断して(Cancel = True)コントロールの移動をしないだけならば、後者は前者を包含しているように思える。すなわち前者は必要ないように思えるが?
なるほど、微妙なタイミングですからねえ。
1 Beforeupdate
2 Afterupdate
3 Exit
この3つのイベントについてかんがえましょう!!
HELPどおりなら、1,2,3の順序でイベントは
発生します。
Updateイベントは、テキストボックスに変更があった場合、フォーカスが
次に移るタイミングで発生します。つまり、変更がなければ発生しない。
対して、Exitは、変更があろうがなかろうがフォーカスが
次に移るタイミングで発生します。
明らかに1,2と3にはイベントの発生に違いが見られますよね!!
では、
1,2は、
新規ブックに
Userform1を作成し、Textbox1とCommandbutton1を作成してください。
同じように
Userform2を作成し、Textbox1とCommandbutton1を作成してください
Userform1のモジュールに
'============================
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1.Text) Then
MsgBox "数字だけだよ"
Cancel = True
End If
End Sub
'=========================
Private Sub UserForm_Initialize()
TextBox1.Text = "123"
End Sub
Useform2のモジュールに
'===========================================
Dim svcancel As Boolean
'===========================================
Private Sub TextBox1_AfterUpdate()
If Not IsNumeric(TextBox1.Text) Then
MsgBox "数字だけ"
svcancel = True
Else
svcancel = False
End If
End Sub
'==============================================================
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = svcancel
svcancel = False
End Sub
'==============================================================
Private Sub UserForm_Initialize()
svcancel = False
TextBox1.Text = "123"
End Sub
このふたつのユーザーフォームで
TextBox1に数字以外をしてしみてください。
表示の違いとコードをよく見比べてみてください。
Cancel=Trueとしたときの後の動作に違いが出てきます。
>
>しかし今回も『ドラえもんのポケット』さながら、『ichinoseさんの魔法の手』(正確には『Excelの宝箱』?)はきっと何かを出すに決まっている。勝手にイベントを作ってしまう?
あっははは、そんなにすごければ、ここにくる必要もないんですが・・・。
確認してください。
|
|