如何轻松在 Excel 上输入时间

如何轻松在 Excel 上输入时间

因此,为了简化我的问题,我在 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:mm12: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变量。

而且,与我之前尝试回答的问题不同,我已经测试过这个问题,而且它似乎有效。(我只花了几分钟进行测试,因此可能还有一些细微的错误尚未发现。)

相关内容