| 
    
     |  | おはようございます。 
 >>'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イベントでのエラーチェックを行わない方向で検討します。
 
 
 |  |