Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Hora válida em VBA

Bom dia, galera, tudo bom?

To com um problema em um UserForm que estou fazendo no VBA. Estou criando um UserForm para registrar ocorrências de anomalias aqui na empresa, nisso, preciso registrar Data Inicial, Data Final, Hora Inicial e Hora Final.

O problema da data inválida, como por exemplo "32/13/2016", eu consegui resolver, mas não consigo resolver o problema da hora válida. Eu digito 88:00 e quando o UserForm adiciona na planilha essa hora de "88:00", fica como "16:00:00" horas, sendo que deveria dar erro.

Como posso fazer isso, alguém pode me ajudar?

Obrigado!

7 respostas

Pelo que eu entendi, você tem um campo onde informa o horário (seja de inicio ou de fim) e você que validar se o horário digitado é válido.

Na época do Visual Basic 6 eu lembro que este tipo de problema era resolvido pela função IsDate(). Talvez isso ainda funcione.

Aqui tem uma discussão sobre isso

http://stackoverflow.com/questions/8163219/time-format-validation

Vou tentar usar o IsDate, fazer uns testes aqui. Caso consiga, eu volto e te falo. Obrigado, cara!

Usei o código assim:

Private Sub cx_hora_inicial_wms_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsDate(cx_data_inicial_wms.Text) Then
        MsgBox ("Digite uma hora válida"), vbInformation
    End If

E deu "Erro 424, objeto é obritarório". Não encontro na internet algo que me ajude.

Olhando o código, eu vejo um erro no MsgBox, você está chamando ele como uma função, mas colocou um parâmetro fora do parenteses.

Outra coisa que me chamou a atenção foi o campo que você quer validar, você colocou a programação para ser executada ao sair do campo de hora_inicial, mas, está tentando validar o campo de data inicial (a mensagem do MSGBox se refere a hora)

Tente fazer este ajuste:

Private Sub cx_hora_inicial_wms_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsDate(cx_hora_inicial_wms.Text) Then
        MsgBox ("Digite uma hora válida", vbInformation)
        Cancel = True 
    End If
End Sub

Eu digitei errado, não posso usar IsDate porque eu estou trabalhando com validação de hora. Só que não acho um IsTime, por exemplo, acredito que não exista para VBA. Então fica difícil fazer essa comparação.

No MsgBox, o vbInformation é apenas o tipo de caixa de alerta que irá aparecer. Eu sempre uso ele fora do () e funciona.

Não encontro na internet algo compare a hora e verifique se é válida.

solução!

Eu estou sem Excel no momento, mas o IsDate valida horários, eu fiz um teste rápido usando o ASP Clássico, e funcionou. VBA, VB6, ASP Clássico... são muito parecidos.

Existe uma segunda abordagem para resolver este problema, você pode criar sua própria função de validação. Supondo que você capture os dados desta forma hh:mm, você pode tentar algo assim

horario_digitado = "12:30"
array_resultados = split(horario_digitado, ":")
hora = array_resultados(0)
minuto = array_resultados(1)

Com os dados em separado, fica fácil validar, basta retornar false se a hora for diferente do intervalo de 0 a 23 e o minuto for diferente de 0 a 59

Para comparar dois hórarios (por exemplo, para evitar que alguém digite o horário final maior que o inicial), você pode pensar numa função que pegue o horário e retorne um número. Exemplo:

horario_digitado = "12:30"
array_resultados = split(horario_digitado, ":")
hora = array_resultados(0)
minuto = array_resultados(1)
resultado = (Cint(hora) * 60) + Cint(minuto)

Dai basta comparar os resultados gerados pelos dois horários

Eu to saindo do estágio agora, mas amanhã quando eu voltar eu tento dessa forma. Separando os horários é bem mais fácil. É que eu fiz uma textBox que já auto completa o ":", mas amanha vou tentar melhorar o programa. Valeu amigo!