Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2010)
ユーザーフォームで一番目の必須入力テキストボックスを設定したい。
投稿日時: 18/02/08 13:29:00
投稿者: のりぴっぴ

UserForm1に上から
TextBox1
TextBox2
TextBox3
が配置されています。
TextBox2は起案日です。一番に入力する、入力は必須、もしフォームを開いた後TextBox2に入力せずマウスで他のテキストボックスをクリックしたとしても、TextBox1に戻ってくる。入力されればTextBox1に飛ぶようにしたいとの気持ちで次のコードをつくりましたが、うまくいきません。TextBox2_ExitなのにTextBox2.SetFocusって変な組み合わせのような気もするのですが、どうすればよいのか思案しております。
どなたかアドバイスいただけませんでしょうか?
あるいはこのような場合、もっと良い方法はあるのでしょうか?
よろしくお願いします。
  
'↓コマンドボタンを押すと
Private Sub CommandButton1_Click()
    UserForm1.TextBox2.SetFocus
    UserForm1.Show
End Sub
 
'↓TextBox2から出るタイミングで
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox2.Value = "" Then
        MsgBox "テキストボックス2は必ず入力してください。"
        TextBox2.SetFocus’←●これが効かない
    Else
        TextBox1.SetFocus
    End If
End Sub

回答
投稿日時: 18/02/08 14:33:18
投稿者: WinArrow
投稿者のウェブサイトに移動

ユーザーフォームの中で、カーソルを移動する順序を設定する「タブオーダー」という機能があります。
 
「タブオーダー」をあえて設定しない場合は、コントロールを作成した順序になります。
 
ですから、ユーザーフォームを開く(起動)前に、最初のコントロールを指定する必要はありません。
 
そして、テキストボックスについて、ある条件に合致しない場合、カーソルを次のボックスに移動させない
ためには、SetFocusではなく、
Exitイベントでは、Cancel = True を使います。
 
もう一つちゅういすることは、
Cancel = True
には、副作用があります。
ある条件に合致しない状態で、入力することを中断して、
コマンドボタンでユーザーフォームを閉じようとすると
カーソルが移動できなくなります。
このような状況を回避するために
コマンドボタン等の「TakeFocusOnClick」に「False」を設定しておきます。

投稿日時: 18/02/08 16:00:09
投稿者: のりぴっぴ

WinArrowさん
またまたまた、ありがとうございます。
できました!
 
○タブオーダーの件、まさしくご指摘の通りでした。私のように基礎知識なく見よう見まねでやっていると、こねくり回した結果不要な小細工を知らぬうちにやってしまいます。とほほです。
 
○Cancel=True まさにヒットです。急がば回れですね。なかなか独力では正解にたどり着けませんでした。
ありがとうございました。