|
>ご指導有難うございます。かなり時間がかかっていますが、また質問です、よろしくお願いします。
>
>>イベントが違うのでは?
>>Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
>
>その通りです。現在Private Sub CommandButton2_Click()の中に、頂いたコードを入れて、
>Cance=Trueをコメントで問題なく動作しています。ただ、Clickするまで反応が得られませんが・・・
>
>頂いたイベントでTextBox1から次の動作をさせると、日付以外は
>MsgBoxでメッセージが出て便利ですが、UserForm表示時に表示をキャンセル
>する右上の「×」を押してもこのMsgBoxが二回表示されその都度OKを押さなくてはなりません。
>・・・何かが災いしているのだと思いますが。
色々なイベントが重なって起こる事が有りえると思いますが?
「Sub CommandButton2_Click()」の中にだけ書いて有るならば
この様には成らないと思います
別に、TextBox1のイベントが有って、其処にも書かれているのでは?
UserFormのコードをUpして見て下さい
また、このコードは以下の様に使う事を想定しています
Private Sub CommandButton2_Click()
If TextBox1.Value = "" Then
MsgBox "TextBox1の入力が有りません"
Exit Sub
End If
'以下処理
End Sub
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With TextBox1
If .Value = "" Then
Exit Sub
End If
If Not IsDate(.Text) Then
Cancel = True
MsgBox .Value & "は入力が日付として認められません" '★変更
.Value = "" '★追加
Else
.Text = Format(DateValue(.Text), "m/d")
End If
End With
End Sub
TextBox1の動きは、
値が書き変わった場合、値をチェックし日付と認められる時は書式を変更して表示
認められない場合、フォーカスをTextBox1の戻して、MsgBoxを表示
値が無かった場合は、チェックをせず次にフォーカスを移す
と成ります
なぜ、値が無い("")場合にチェックをしないのかと言いますと
今回の様に、UserFormを開いて何もせず閉じた場合、常にチェックしていると
入力チェックに引っ掛かり直ぐに閉じられません
其処で、TextBoxのイベントでは、値が無い("")場合のチェックをせず
TextBoxの値を使って処理を行うCommandButtonのイベントの方で値の有無のチェックを行います
(既に、TextBoxのイベントで値の整合性は確保されていますので)
>コードの動き見たいのですが、
>UserFormでのステップイン(F8)のような方法は無いのでしょうか?
F8は、UserFormでも使えますよ?
もし、「×」ボタンを押した時からと言う意味なら、
「×」ボタンが押されると「Sub UserForm_QueryClose」のイベントが起きますので
例えば、その中に以下の様なダミーの処理を書いて、此れに(i = 1)ブレークポイントを設定します
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim i As Long
i = 1
End Sub
そうすれば観られるでしょ?
|
|