1

Итак, упрощая мою задачу, у меня есть две колонки в 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 ответ1

0

Проблема в том, если набрать 1234

  • в столбце 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

Оказывается, как только мы подтвердили, что цель находится в столбце A или B , а затем проверили, находится ли она в столбце A , нам не нужно явно проверять, находится ли она в столбце B - это единственное место, где она может быть.  И, поскольку мы всегда знаем, какой формат использовать, нам нужна только одна переменная vVal .

И, в отличие от моей предыдущей попытки ответить, я проверил это, и, похоже, работает.  (Я потратил всего несколько минут на тестирование, поэтому еще могут быть обнаружены незначительные ошибки.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .