因此,为了简化我的问题,我在 Excel 上有两列。
第一个(A)应该是格式为 的时间输入hh:mm
。
第二个(B)应该是格式为的时间输入hh:mm:ss
。
好的,这样我就可以让它更方便最终用户使用。我想帮助他,让他可以轻松地"1230"
在 A 列中输入,这样它就会自动转换为12:30
,并且可以轻松地"153055"
在 B 列中输入,这样它就会自动转换为15:30:55
。
所以基本上我想让他免于输入冒号。
因此,我创建了这个 VBA 代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vVala, vValb
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("A1:B100")) Is Nothing Then Exit Sub
With Target
vVala = Format(.Value, "000000")
vValb = Format(.Value, "0000")
If IsNumeric(vVala) And Len(vVala) = 6 Then
Application.EnableEvents = False
.Value = Left(vVala, 2) & ":" & Mid(vVala, 3, 2) & ":" & Right(vVala, 2)
.NumberFormat = "hh:mm:ss"
End If
If IsNumeric(vValb) And Len(vValb) = 4 Then
Application.EnableEvents = False
.Value = Left(vValb, 2) & ":" & Right(vValb, 2)
.NumberFormat = "hh:mm"
End If
End With
Application.EnableEvents = True
End Sub
问题是我遇到了一个错误。例如,当我在 B 列的任何单元格中键入时,011003
它会正确地给出01:10:03
,但如果小时数等于零,例如000103
(或00:01:03
),它实际上并不理解零是小时数,而是给出01:03
。
这可能是因为我的目标范围设置为两列(Range("A1:B100"))
,而它们应该是分开的:“4 位数字”代码设置为 A 列,“6 位数字”代码设置为 B 列。
我不知道如何区分目标。有人能帮我吗?
答案1
问题是,如果1234
输入
- 在 Column 中
A
,您希望将其解释为12:34:00
(但格式化为hh:mm
→12:34
)。 - 在列中
B
,您希望将其解释为00:12:34
(格式化为hh:mm:ss
)。
因此,例程无法仅通过查看输入数据来确定要做什么(就像您的尝试和我之前的尝试一样);它必须知道用户正在输入哪一列。这样做的方法是检查Intersect(Target, Range("A1:A100"))
和Intersect(Target, Range("B1:B100"))
,然后只需使用适合您所在列的格式,如下所示:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vVal
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("A1:B100")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
' We’re in Column A, so use hh:mm.
vVal = Format(.Value, "0000")
If IsNumeric(vVal) And Len(vVal) = 4 Then
.Value = Left(vVal, 2) & ":" & Right(vVal, 2)
.NumberFormat = "hh:mm"
End If
Else
' We’re in Column B, so use hh:mm:ss.
vVal = Format(.Value, "000000")
If IsNumeric(vVal) And Len(vVal) = 6 Then
.Value = Left(vVal, 2) & ":" & Mid(vVal, 3, 2) & ":" & Right(vVal, 2)
.NumberFormat = "hh:mm:ss"
End If
End If
End With
Application.EnableEvents = True
End Sub
事实证明,一旦我们确认目标在 Column A
或 中B
,然后我们检查它是否在 Column 中 A
,那么我们就不需要明确测试它是否在 Column 中 B
— 这是它唯一可以出现的地方。而且,由于我们始终知道要使用什么格式,因此我们只需要一个vVal
变量。
而且,与我之前尝试回答的问题不同,我已经测试过这个问题,而且它似乎有效。(我只花了几分钟进行测试,因此可能还有一些细微的错误尚未发现。)