Excel (VBA)

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

 
(Windows 10 Pro : Excel 2010)
ユーザーフォーム TextBox1は日付専用です。日付でないときはMsgBoxで警告を表示しています。入力をやめるためフォームの×を押しても表示されてしまいます。
投稿日時: 20/06/05 17:08:57
投稿者: のりぴっぴ

ユーザーフォーム TextBox1は日付専用です。
日付が入力されなかったり、空白の場合には、テキストボックスをイエローで塗りつぶすとともに、警告メッセージを表示し、Exitをキャンセルしています。
このまま正しい日付を入力し直すときは問題ないのですが、入力を中止するためフォーム右肩の×をクリックしたときに問題発生
ここでもMsgBoxが表示されてしまいます。×clickの時には表示されないようにするにはどうすればよいのでしょうか。
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    '↓生年月日に日付が入力されていなければ次に進まないようにする。
    If IsDate(TextBox1) = False Then
            Me.TextBox1.BackColor = QBColor(14)
            MsgBox "日付が入力されていません。"
            Cancel = True '
    Else
        Me.TextBox1.BackColor = QBColor(15)
    End If
End Sub
 
なぜこうなるのか、どうすれば防げるのか、どなたかご教示いただきたくよろしくお願いします。

回答
投稿日時: 20/06/05 18:10:32
投稿者: sk

引用:
日付が入力されなかったり、空白の場合には、テキストボックスを
イエローで塗りつぶすとともに、警告メッセージを表示し、Exitをキャンセルしています。
このまま正しい日付を入力し直すときは問題ないのですが、入力を中止するため
フォーム右肩の×をクリックしたときに問題発生
ここでもMsgBoxが表示されてしまいます。

引用:
なぜこうなるのか

TextBox1 にフォーカスがある状態から
フォームが閉じられようとするのに伴い、
TextBox1 からフォーカスが離れようとする
( TextBox1 の Exit イベントが発生する)ため。
 
引用:
×clickの時には表示されないようにするにはどうすればよいのでしょうか。

引用:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    '↓生年月日に日付が入力されていなければ次に進まないようにする。
    If IsDate(TextBox1) = False Then
            Me.TextBox1.BackColor = QBColor(14)
            MsgBox "日付が入力されていません。"
            Cancel = True '
    Else
        Me.TextBox1.BackColor = QBColor(15)
    End If
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.Visible = False Then
        Cancel = True
        Exit Sub
    End If
    '↓生年月日に日付が入力されていなければ次に進まないようにする。
    If IsDate(TextBox1) = False Then
            Me.TextBox1.BackColor = QBColor(14)
            MsgBox "日付が入力されていません。"
            Cancel = True '
    Else
        Me.TextBox1.BackColor = QBColor(15)
    End If
End Sub
----------------------------------------------------------------
 
UI 設計の観点で言えば、Exit イベントではなく
BeforeUpdate イベントの方がよいのではないか、
と推察しますが。

回答
投稿日時: 20/06/05 20:06:23
投稿者: WinArrow
投稿者のウェブサイトに移動

Exit でもBeforeUpdateでも
Cancel = True
を設定する方法では、必ず、MSGBOXが表示されます。
 
コマンドボタンを押して検証する方法など
別の方法を検討してみましょう。

投稿日時: 20/06/05 20:37:38
投稿者: のりぴっぴ

skさん
早速に答えをお示しいただきありがとうございました。
質問に丁寧にお答えいただき、よくわかりました。
質問させていただいてよかったです。
自力での解決ではいつになったかわかりません。
 
winArrowさん
いつぞやもお世話になりました。ご指摘の点も参考に今後、自分なりに研究してみたいと思います。
ありがとうございました。