|
おはようございます。
>>'If 入力データが妥当でないとき
>>
>> If MsgBox("入力エラーです.再入力しますか?", vbOKCancel) = vbOk then
>> Cancel = True
>> Else
>> Exit Sub
>> End If
>>'End If
> にしましたが、再入力をしますでTextboxのデータを削除しますが、
>Textboxにフォーカスが移りません。
>フォーカスが出るようにしたいのですが、・・・・・
この現象Excel2002(2000でも)ではユーザーフォームがモードレスで
表示された場合でないと再現できません。
モーダルで表示した場合は、きちんとTextboxにフォーカスが戻ります。
もし、モーダルでもフォーカスが戻らない という現象なら、ExcelやWinのバージョンも
教えてください。
で、
「ユーザーフォームがモードレスで表示された場合」の現象だとして・・・。
新規ブックのユーザーフォーム(Userform1)に
テキストボックス(TextBox1)
コマンドボタン(Commandbutton1)
を配置してください。
Userform1のモジュールに
'===============================================================
Option Explicit
Private focus_obj As Object 'フォーカスを当てるコントロール
Private ev As Long '0--イべントを実行 その他--イベントを実行しない
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If ev <> 0 Then Exit Sub
With TextBox1
If IsNumeric(.Text) And (Val(.Text) Mod 3 = 0 Or InStr(.Text, "3") > 0) Then
If MsgBox("3の倍数か3の付く数字は、馬鹿になるから駄目。再入力しますか?", vbOKCancel) = vbOK Then
ev = 1
.Visible = False
.Text = ""
Set focus_obj = TextBox1
Me.Hide
Me.Show vbModeless
.Visible = True
ev = 0
Cancel = True
End If
End If
End With
End Sub
'===================================================================
Private Sub UserForm_Activate()
If Not focus_obj Is Nothing Then
focus_obj.SetFocus
Set focus_obj = Nothing
End If
End Sub
標準モジュールに
'=====================================================================
Sub main()
UserForm1.Show vbModeless
End Sub
これでmainを実行して、テキストボックスに「世界のナベアツが馬鹿になる数字」を
入力して試してみてください。
***************************************
このExitイベントは、色んな面で扱いが面倒です。
バグも多いし、配列の実現も難しいことをしないとできないし・・・。
私も実際には、neptuneさんの
>全部のデータ入力後何らかの処理をする前に、全てのデータの正当性をチェックし、問
>題がある時はそのTextBoxにフォーカスし、データを選択してやる
という方法で対処できるような仕様にしてしまいます。
つまり、Exitイベントでのエラーチェックを行わない方向で検討します。
|
|