Excel VBA:发生错误后高亮显示文本框值

Excel VBA:发生错误后高亮显示文本框值,excel,vba,textbox,highlight,Excel,Vba,Textbox,Highlight,我试图突出显示文本框中输入的值文本框值表示日期格式DD-MM-YYYY中的日期值。我编写了一些代码来验证插入日期是否正确(在4月31日的示例中) Hightlight本身不是问题,但是我想在发生错误后立即执行此操作。因此,当我插入2014年4月31日时,我应该会收到消息“您插入了错误的日期”,并且日期值应该高亮显示。现在,它向我显示消息,突出显示值,并将焦点设置为另一个CommandButton 到目前为止,我制作了如下内容: Private Sub data_faktury_AfterUpda

我试图突出显示
文本框
中输入的值<代码>文本框值表示日期格式DD-MM-YYYY中的日期值。我编写了一些代码来验证插入日期是否正确(在4月31日的示例中)

Hightlight本身不是问题,但是我想在发生错误后立即执行此操作。因此,当我插入2014年4月31日时,我应该会收到消息“您插入了错误的日期”,并且日期值应该高亮显示。现在,它向我显示消息,突出显示值,并将焦点设置为另一个
CommandButton

到目前为止,我制作了如下内容:

Private Sub data_faktury_AfterUpdate()

Dim dzien As Byte, miesiac As Byte
Dim rok As Integer

On Error GoTo blad:

dzien = Mid(data_faktury.Value, 1, 2)
miesiac = Mid(data_faktury.Value, 4, 2)
rok = Right(data_faktury.Value, 4)



Call spr_date(dzien, miesiac, rok)


Exit Sub

blad:
If Err.Number = 13 Then
    If data_faktury <> "" Then
        If Len(data_faktury) < 10 Then: MsgBox ("Źle wpisana data faktury.")
    End If
End If

End Sub

这是一个有点长的评论,所以这里去。基本原则是使用退出事件并在必要时取消。要防止在关闭表单时触发此操作,需要使用标志变量-示例userform代码:

Private bSkipEvents As Boolean
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If bSkipEvents Then Exit Sub

    With TextBox1
        If Not IsValidDate(.Text) Then
            Cancel = True
            MsgBox "Invalid date"
            .SelStart = 0
            .SelLength = Len(.Text)
        End If
    End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    bSkipEvents = True
End Sub

改为使用退出事件,设置Cancel=True,然后使用Selstart和Sellength代码(无需设置焦点)…但是如何将信息从
Sub-zle()
发送到
Exit()
事件?只有在处理
Sub zle()
时,才会出现此强光。如果日期有效,验证例程将使用返回true的函数。退出事件将日期字符串传递给函数-如果验证失败,则退出代码将取消并设置焦点,而不是验证例程。很好的提示,谢谢。然而,出现了一个问题。当我关闭我的
UserForm
并且插入了错误的日期时,将处理
Exit
事件并告诉我日期错误。然后关闭
UserForm
。我希望避免看到该消息,换句话说,当我点击我的
Useform
上的“X”按钮时,不要处理该事件。太棒了!很好用!你可能是今天的英雄:)
Private bSkipEvents As Boolean
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If bSkipEvents Then Exit Sub

    With TextBox1
        If Not IsValidDate(.Text) Then
            Cancel = True
            MsgBox "Invalid date"
            .SelStart = 0
            .SelLength = Len(.Text)
        End If
    End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    bSkipEvents = True
End Sub