我在excel表中工作,我希望所有数据都在日期范围之间,因此创建了一个带有两个组合框的用户表单来选择日期范围(即一个开始日期和另一个结束日期),但是当我选择数字格式显示的日期,即日期28-07-2012的41118。然后我在程序
中添加以下代码Private Sub ComboBox1_Change()
ComboBox1.Value = Format(ComboBox1.Value, "dd-mm-yyyy")
End Sub
现在问题已经解决,但现在它工作缓慢,需要10-15秒才能选择日期。 我找不到问题出在哪里?任何人的帮助都将得到很大的支持。提前谢谢。
答案 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