O problema é, se 1234
for digitado
- na coluna
A
, você quer que ele seja interpretado como12:34:00
(mas formatado comohh:mm
→12:34
). - na coluna
B
, você quer que ele seja interpretado como00:12:34
(formatado comohh: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.)