Excel - converte a entrada numérica em valor de tempo

1

Eu já formatei algumas células no Excel 2010 com esse tipo personalizado:

##":"##

porque eu quero que os usuários possam digitar "1345" para obter "13:45" ou "923" para obter "9:23". Isso funciona sem o hazzle.

Meu problema é que em certos cenários o usuário pode digitar apenas "13" e isso gera um resultado estranho como "-1".

É possível formatar as células para que o "13" seja formatado para "13:00", mantendo a formatação mencionada acima?

Obrigado.

    
por Morten Laustsen 18.06.2013 / 13:46

1 resposta

2

Não consigo recriar o "13" > Cenário "-1". Quais são suas configurações regionais?

Mas o seu formato personalizado definitivamente não lida com os horários entre a meia-noite e a 1 da manhã. O zero inicial em 013 é retirado.

O problema é que você não sabe se o usuário que entra em 13 significa 00:13 ou 13:00. Enquanto isso estiver aberto à interpretação, nenhuma formatação, fórmula ou solução de código ajudará.

Isso é mais sobre a educação do usuário do que sobre qualquer outra coisa.

Você pode querer aplicar o VBA em vez de formatos personalizados para garantir que

a) o usuário insere caracteres suficientes para uma interpretação sem dúvida de um valor de tempo, por ex. 013 para 0:13 e 13:00 para 13:00

b) os valores não são apenas formatados para parecerem tempos, mas serão, na verdade, valores de tempo que podem ser usados em cálculos para diferenças de tempo

c) zeros à esquerda não são removidos quando uma hora é inserida.

Abaixo está um UDF que transforma essas entradas em valores de data / hora. Ele também contém o recurso de adicionar ou subtrair dias, adicionando um ou mais sinais + ou - à entrada. Chame essa função de um evento de alteração da planilha.

Public Function TimeEntry(iTarget As String) As Variant

' convert values into date/times
'
' expected user input in the format of
'
' 1430      will be converted to today, 14:30
' 1430+     will be converted to today + 1 day, 14:30
' 1430-     will be converted to today - 1 day, 14:30
'
' multiple + or - signs are allowed to enable quick entry of time several days ago or
' in the future
'

Dim IncDay As Integer, DecDay As Integer
Dim eTime As Variant
On Error GoTo Message
    Msg = ""
    eTime = Application.WorksheetFunction.Substitute(iTarget, "+", "")
    eTime = Application.WorksheetFunction.Substitute(eTime, "-", "")
    eTime = Format(eTime, "0000")
' a few error checks to validate the data
' - can only start with a number
' - must be a number after stripping off the + and - signs
' - cannot be less than 3 or more than 4 digits
' - cannot be more than 23:59
    If Not IsNumeric(Left(iTarget, 1)) Or _
        Not IsNumeric(eTime) Or _
        Len(eTime) > 4 Or _
        eTime > 2359 Then
        GoTo Message
    End If
' insert a colon before the last two digits and convert into a time
    eTime = Left(eTime, Len(eTime) - 2) & ":" & Right(eTime, 2)
    eTime = TimeValue(eTime)
' determine how many days to increase or decrease
    IncDay = Len(iTarget) - Len(Application.WorksheetFunction.Substitute(iTarget, "+", ""))
    DecDay = Len(iTarget) - Len(Application.WorksheetFunction.Substitute(iTarget, "-", ""))

' increase/decrease current date and add the time value
    TimeEntry = Date + IncDay + (DecDay * -1) + eTime

GoTo Ende
Message:
        Msg = "Invalid time value entered" & Chr(10) & Chr(10)
        Msg = Msg & "Please enter time values like this: " & Chr(10) & Chr(10)
        Msg = Msg & " 900   for 9:00 am today " & Chr(10)
        Msg = Msg & "2130+  for 21:30 tomorrow " & Chr(10)
        Msg = Msg & " 000+  for midnight tonight" & Chr(10)
        Msg = Msg & "1000-- for 10 am two days ago."
        MsgBox Msg
        TimeEntry = ""

Ende:
End Function
    
por 18.06.2013 / 14:27