【发布时间】:2022-06-10 20:35:34
【问题描述】:
代码是用于证明白痴的时间表。
例如;
-
输入 0845 更改为正确的时间格式 08:45
-
输入 8:45 会更改为正确的时间格式 08:45
-
输入 845 更改为正确的时间格式 08:45
-
输入了错误的时间值,例如 08:75,会出现一个消息框“您没有输入有效时间”并将值更改回 00:00
以上都正常工作。
我的问题是,我怎样才能让它改变一个'。'例如,如果有人输入 08.45 而不是 08:45,则为 ':'。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TimeStr As String
On Error GoTo EndMacro
If Application.Intersect(Target, Range("B5:AC126")) Is Nothing Then
Exit Sub
End If
If Target.Cells.Count > 1 Then
Exit Sub
End If
If Target.Value = "" Or Target.Value < 1 Then
Exit Sub
End If
Application.EnableEvents = False
With Target
If .HasFormula = False Then
Select Case Len(.Value)
Case 1 ' e.g., 1 = 01:00 AM
TimeStr = Left(.Value, 1) & ":00"
Case 2 ' e.g., 12 = 12:00 AM
TimeStr = Left(.Value, 2) & ":00"
Case 3 ' e.g., 735 = 7:35 AM
TimeStr = Left(.Value, 1) & ":" & _
Right(.Value, 2)
Case 4 ' e.g., 1234 = 12:34
TimeStr = Left(.Value, 2) & ":" & _
Right(.Value, 2)
Case 5 ' e.g., 12345 = 1:23:45 NOT 12:03:45
TimeStr = Left(.Value, 1) & ":" & _
Mid(.Value, 2, 2) & ":" & Right(.Value, 2)
Case 6 ' e.g., 123456 = 12:34:56
TimeStr = Left(.Value, 2) & ":" & _
Mid(.Value, 3, 2) & ":" & Right(.Value, 2)
Case Else
Err.Raise 0
End Select
.Value = TimeValue(TimeStr)
End If
End With
Application.EnableEvents = True
Exit Sub
EndMacro:
If Not (IsDate(MyDate)) Then
MsgBox "You did not enter a valid time"
End If
Application.EnableEvents = True
End Sub
【问题讨论】:
-
如果您的用户遇到此类问题,我建议您开发一个用户表单来控制数据输入过程,而不是事后尝试更正它。
-
我想第一步是精确地“允许”哪个输入以及它是如何解释的?
775应该是 7:45 吗?使用相同的逻辑730将是 7:18。 7.25 是否应该被视为 7:15?7,25也可以吗? -
类似于 FunThomas 的问题,输入的
.5是否等同于00:30?我不能对罗恩的评论给予足够的支持......除非你想处理麻烦,否则你会想要控制字段,例如,一个小时的字段和一个小时或实际分钟的小部分字段,所以没有关于每个中输入的内容的问题。使用用户表单的方面比简单的输入框更理想,因为您可以请求拆分信息,而不是运行替换/替换/等。在单个字符串上使其成为您想要的样式。 -
所以允许的输入应该在 700 到 759 之间,并且被视为 07:00 到 07:59。这是代码当前所做的。但是,如果输入 760 到 799,则应显示错误消息并将值设置为 00:00。
-
类似地,如果输入 7.60 到 7.99,这应该会显示一条错误消息并将值设置为 00:00。 .5 被视为 50 分钟而不是 30 分钟。