组合框日期格式vba excel

时间:2017-03-06 08:52:18

标签: excel vba

我在excel表中工作,我希望所有数据都在日期范围之间,因此创建了一个带有两个组合框的用户表单来选择日期范围(即一个开始日期和另一个结束日期),但是当我选择数字格式显示的日期,即日期28-07-2012的41118。然后我在程序

中添加以下代码
Private Sub ComboBox1_Change()
ComboBox1.Value = Format(ComboBox1.Value, "dd-mm-yyyy")
End Sub

现在问题已经解决,但现在它工作缓慢,需要10-15秒才能选择日期。 我找不到问题出在哪里?任何人的帮助都将得到很大的支持。提前谢谢。

2 个答案:

答案 0 :(得分:3)

更改ComboBox在其中的更改事件的值将再次触发事件,这有点像循环。尝试在更改值之前禁用事件并在之后启用它们:

Private Sub ComboBox1_Change()
Application.EnableEvents = False
ComboBox1.Value = Format(ComboBox1.Value, "dd-mm-yyyy")
Application.EnableEvents = True
End Sub

答案 1 :(得分:0)

以下代码仅允许将格式为“ dd.mm.yyyy”的日期值添加到文本框中(更改组合框的日期值)。日期必须大于2000年1月1日且小于31.12.2099,并且会显示一条消息提醒您输入的日期是否是将来的日期:

Private Sub TextBox1_Change()
Dim ldm As Integer
Dim Reply As Long
Application.EnableEvents = False
If InStr(1, Join(Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "."), "|"), Right(TextBox1.Text, 1)) = 0 Then _
TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
If Len(TextBox1.Text) = 1 Then
    If TextBox1.Text > 3 Then
        TextBox1.Text = "0" & TextBox1.Text
    End If
ElseIf Len(TextBox1.Text) = 2 Then
    If Mid(TextBox1.Text, 2, 1) = "." Then
        TextBox1.Text = "0" & Left(TextBox1.Text, 1) & "."
        Exit Sub
    End If
    If TextBox1.Text < 31 Then
        TextBox1.Text = TextBox1.Text & "."
    Else
        TextBox1.Text = "31."
    End If
ElseIf Len(TextBox1.Text) = 4 Then
    If Right(TextBox1.Text, 1) > 1 Then
        TextBox1.Text = Left(TextBox1.Text, 3) & "0" & Right(TextBox1.Text, 1)
    End If
ElseIf Len(TextBox1.Text) = 5 Then
    If Right(TextBox1.Text, 1) = "." Then
        If Mid(TextBox1.Text, 4, 1) = 0 Then
            TextBox1.Text = Left(TextBox1.Text, 4)
            Exit Sub
        Else
            TextBox1.Text = Left(TextBox1.Text, 3) & "0" & Mid(TextBox1.Text, 4, 1) & "."
            Exit Sub
        End If
    End If
    If Right(TextBox1.Text, 2) < 13 Then
        TextBox1.Text = TextBox1.Text & "."
    Else
        TextBox1.Text = Left(TextBox1.Text, 3) & "12."
    End If
ElseIf Len(TextBox1.Text) = 7 Then
    If Right(TextBox1.Text, 1) <> "2" Then
        TextBox1.Text = Left(TextBox1.Text, 6) & "2"
    End If
ElseIf Len(TextBox1.Text) = 8 Then
    If InStr(1, Join(Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), "|"), Right(TextBox1.Text, 1)) = 0 Then _
    TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
    If Right(TextBox1.Text, 1) > 0 Then
        TextBox1.Text = Left(TextBox1.Text, 7) & "0"
    End If
ElseIf Len(TextBox1.Text) = 9 Then
    If InStr(1, Join(Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), "|"), Right(TextBox1.Text, 1)) = 0 Then _
    TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
ElseIf Len(TextBox1.Text) = 10 Then
    If IsNumeric(TextBox1.Text) = False Then TextBox1.Text = Left(TextBox1.Text, 8)
    ldm = Format(DateSerial((Right(TextBox1.Text, 4)), (Mid(TextBox1.Text, 4, 2)) + 1, 0), "d")
    If Left(TextBox1.Text, 2) > ldm Then TextBox1.Text = ldm & Right(TextBox1.Text, 8)
    If DateSerial(Right(TextBox1.Text, 4), Mid(TextBox1.Text, 4, 2), Left(TextBox1.Text, 2)) > Now() Then
        Reply = MsgBox("Das eingegebene Datum liegt in der Zukunft." & vbNewLine & "Wollen Sie es so lassen?", vbYesNo, "Datum in der Zukunft")
        If Reply = vbNo Then
            TextBox1.Text = Format(Now(), "DD.MM.YYYY")
        End If
    End If
    If Mid(TextBox1.Text, 3, 1) <> "." Then TextBox1.Text = Left(TextBox1.Text, 2) & "." & Right(TextBox1.Text, 7)
    If Mid(TextBox1.Text, 6, 1) <> "." Then TextBox1.Text = Left(TextBox1.Text, 5) & "." & Right(TextBox1.Text, 4)
ElseIf Len(TextBox1.Text) > 10 Then
    TextBox1.Text = Left(TextBox1.Text, 10)
End If
Application.EnableEvents = True
End Sub