Excel (VBA)

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

 
(Windows 10 Pro : Excel 2010)
UserFormのテキストボックス動作制御について
投稿日時: 17/08/18 10:41:18
投稿者: ふぁんふぁn

ユーザーフォームに2つのTextBoxがあります。
 TextBox1 : 開始日 (yyyy/mm/dd)
 TextBox2 : 終了日 (yyyy/mm/dd)
 
TextBox2の値チェックの際に、TextBox1 > TextBox2 の場合エラーメッセージを表示させて、
TextBox1にフォーカスを移したいのですが、どのようにすれば良いか教えてください。
 
【以下、実際のマクロです】
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' 開始日チェック処理
     With Me.TextBox1
        If IsDate(.Value) Then
            .Value = Format(.Value, "yyyy/mm/dd")
        Else
           If TextBox1 <> "" Then
              MsgBox "日付を入力してください(月/日)"
              Cancel = True
           Else
              TextBox1 = W開始予定
           End If
        End If
     End With
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' 終了日チェック処理
     With Me.TextBox2
        If IsDate(.Value) Then
            .Value = Format(.Value, "yyyy/mm/dd")
        Else
           If TextBox2 <> "" Then
              MsgBox "日付を入力してください(月/日)"
              Cancel = True
           Else
              TextBox2 = W終了予定
           End If
        End If
        If TextBox1 <> "" Then
           If TextBox2 <> "" Then
              If TextBox1 > TextBox2 Then
                 MsgBox "開始日<終了日です(大小チェックエラー)"
                 Cancel = True
              End If
           End If
        End If
     End With
End Sub
 

回答
投稿日時: 17/08/18 10:56:36
投稿者: WinArrow
投稿者のウェブサイトに移動

Textbox2の方を
Exitイベントではなく
AfterUpDateイベントを使いましょう。
そしてエラーの場合
TextBox1.SetFocus
 
を追加すればよいでしょう。
 
なお、エラーメッセージ間違っていますよ!

回答
投稿日時: 17/08/18 10:59:39
投稿者: WinArrow
投稿者のウェブサイトに移動

コードの書き方のアドバイス
 
With Me.TextBox1
 
と折角、With 句を使っているんだから
> If TextBox1 <> "" Then

> TextBox1 = W開始予定
は、統一性がありませんね?

投稿日時: 17/08/18 11:35:10
投稿者: ふぁんふぁn

WinArrowさん、エラーメッセージのご指摘と回答ありがとうございます。
 
下記のように変更してみました。
TextBox1.SetFocus指定しているにもかかわらず、メッセージボックス表示後(2回メッセージ表示されます)TextBox4にFocusが移動してしまいました。
エラーメッセージをコメント化してもTextBox4にFocusが移動します。
※TextBox3:時間入力、TextBox4:備考入力
 
Private Sub TextBox2_AfterUpdate()
' 終了予定日チェック処理
     With Me.TextBox2
        If IsDate(.Value) Then
           .Value = Format(.Value, "yyyy/mm/dd")
        Else
           If .Value <> "" Then
              MsgBox "日付を入力してください(月/日)"
           Else
              .Value = W終了予定
           End If
        End If
        If TextBox1 > .Value Then
           MsgBox "開始日>終了日です(大小チェックエラー)"
           TextBox1.SetFocus
        End If
     End With
End Sub

回答
投稿日時: 17/08/18 16:58:31
投稿者: WinArrow
投稿者のウェブサイトに移動

テキストボックスは2つだけと思いこみ、テストして回答してしまいましたが、
 
テキストボックスのExitイベントでは、難しいですね。
 
コマンドボタンを用意し、コマンドボタンで全てのチェックを掛ければ
解決すると思います。
 
なお、チェックする順序も変えた方がよいです。
エラーになるケースを先のチェックする。→処理を抜ける。
 
あと、スペースの場合、w開始予定をプログラムでセットしていますが、
例えば、ダブルクリックイベントで、w開始予定を代入するなどすれば、操作支援になると思います。
 
 

回答
投稿日時: 17/08/20 18:22:30
投稿者: WinArrow
投稿者のウェブサイトに移動

TextBoxのExitイベントの効能(メリット/デメリット)を
よう理解しましょう。
 
今回の場合、Exitイベントでは対応できないでしょう

投稿日時: 17/08/21 10:44:33
投稿者: ふぁんふぁn

Exitをやめて今回はBeforeUpdateにしてみました。
 
また、大小チェックなどのチェックをコマンドボタンで行うことで、スッキリ解決しました。
さらに、操作支援用の「スペースの場合、w開始予定をセットする」事はやめ、DblClickイベントで値を代入するように修正しましたら、すごく受けがよかったです。
 
分かりやすいご指摘に感謝します。
ありがとうございました。