Como facilitar a entrada de tempo no excel

1

Assim, simplificando meu problema, tenho duas colunas no excel.

O primeiro (A) deve ser uma entrada de hora formatada como hh:mm .

O segundo (B) deve ser uma entrada de hora formatada como hh:mm:ss .

Ok, então estou facilitando para o usuário final. Eu gostaria de ajudá-lo e fazê-lo funcionar de uma maneira que ele possa facilmente digitar "1230" na coluna A, então ele será automaticamente convertido em 12:30 , e facilmente digite "153055" na coluna B para que seja automaticamente convertido para %código%.

Então, basicamente, eu quero salvá-lo de digitar dois pontos.

Assim, criei este código 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

O problema é que estou recebendo um bug. Quando eu digito, por exemplo, em qualquer célula da coluna B, 15:30:55 me fornece corretamente 011003 , mas se as horas forem iguais a zero, por exemplo, 01:10:03 (ou 000103 ) na verdade não entende os zeros como sendo as horas e me dá 00:01:03 .

Isso provavelmente é causado pelo fato de o intervalo do meu destino estar definido para as duas colunas 01:03 , quando deveria ser separado: o código "4 dígitos" para a coluna A e o código "6 dígitos" para a coluna B.

Eu não sei como separar os alvos, no entanto. Alguém pode me ajudar?

    
por Igor Radichi 17.08.2017 / 04:40

1 resposta

0

O problema é, se 1234 for digitado

  • na coluna A , você quer que ele seja interpretado como 12:34:00 (mas formatado como hh:mm12:34 ).
  • na coluna B , você quer que ele seja interpretado como 00:12:34 (formatado como hh:mm:ss ).

Portanto, não há como a rotina descobrir o que fazer apenas olhando os dados de entrada (como fez a sua tentativa e a minha anterior); ele precisa saber em qual coluna o usuário está digitando. A maneira de fazer isso é verificar Intersect(Target, Range("A1:A100")) e Intersect(Target, Range("B1:B100")) , e depois basta usar o formato apropriado para a coluna em que você está, assim:

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

Acontece que, Assim que confirmarmos que o destino está na coluna A ou B , e depois verificamos se está na coluna A , então não precisamos testar explicitamente se está na coluna B - esse é o único lugar que pode ser. E, como sempre sabemos qual formato usar, precisamos apenas de uma variável vVal .

E, ao contrário da minha tentativa anterior de responder, Eu testei isso e parece funcionar. (Passei apenas alguns minutos testando, então pode haver bugs sutis a serem descobertos.)

    
por 17.08.2017 / 05:11