none
Erro na Data RRS feed

  • Pergunta

  • Boa noite

    no procedimento abaixo ao digitar a data 32/12/13 retorna 13/12/1932, o correto seria uma mensagem de erro, mais o codigo converteu e aceitou.

    Como reverter a falha? 

    Private Sub TxtData_Enter()
        TxtData.BackColor = &HFFFF&
    End Sub
    Private Sub TxtData_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        TxtData.BackColor = vbWhite
        TxtData = Format(TxtData, "dd/mm/yyyy")
        If IsDate(Me.TxtData.Text) = False Then
         MsgBox " A Data " & TxtData & " é Inválida", vbCritical, "AVISO"
         TxtData = ""
         TxtData.SetFocus
         Else
        End If
        If IsDate(Me.TxtData.Text) = True Then
         If CDate(TxtData.Value) > Format(Date, "dd/mm/yyyy") Then
          MsgBox "O Ano da Data " & TxtData & " é Maior que " & Date, vbCritical, "AVISO"
          TxtData = ""
          TxtData.SetFocus
         Else
         End If
        End If
    End Sub
    Private Sub TxtData_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    TxtData.MaxLength = 10
     Select Case KeyAscii
       Case 8, 48 To 57 ' BackSpace e numericos
        If Len(TxtData) = 2 Then TxtData.Text = TxtData.Text & "/"
        If Len(TxtData) = 5 Then TxtData.Text = TxtData.Text & "/"
        Me.TxtData.SelStart = VBA.Len(Me.TxtData.Value)
        'End If
        Case Else ' o resto é travado
        KeyAscii = 0
       End Select
    End Sub
    Obrigado.
    sábado, 21 de dezembro de 2013 23:00

Respostas

  • boa noite

    usei este procedimento e ele se comportou igual ao anterior

    If Not IsDate(Me.TxtData.Text) Then
      MsgBox
    "Favor inserir uma data válida!", vbCritical
     
    Exit Sub
    End if

    é igual a este

    Private Sub TxtData_Exit(ByVal Cancel As MSForms.ReturnBoolean)
       
    TxtData.BackColor = vbWhite
       
    TxtData = Format(TxtData, "dd/mm/yyyy")
       
    If IsDate(Me.TxtData.Text) = False Then
        
    MsgBox " A Data " & TxtData & " é Inválida", vbCritical, "AVISO"
        
    TxtData = ""
        
    TxtData.SetFocus
        
    Else
       
    End If
    end

    vou tentar adaptar o calendario do enderço  http://www.ambienteoffice.com.br/officevba/calendario_pop-up/ ao arquivo.

    Obrigado.

    • Marcado como Resposta JLNunes sexta-feira, 27 de dezembro de 2013 23:56
    sexta-feira, 27 de dezembro de 2013 23:55

Todas as Respostas

  • Boa noite

    no procedimento abaixo ao digitar a data 32/12/13 retorna 13/12/1932, o correto seria uma mensagem de erro, mais o codigo converteu e aceitou.

    Como reverter a falha? 

    Private Sub TxtData_Enter()
        TxtData.BackColor = &HFFFF&
    End Sub
    Private Sub TxtData_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        TxtData.BackColor = vbWhite
        TxtData = Format(TxtData, "dd/mm/yyyy")
        If IsDate(Me.TxtData.Text) = False Then
         MsgBox " A Data " & TxtData & " é Inválida", vbCritical, "AVISO"
         TxtData = ""
         TxtData.SetFocus
         Else
        End If
        If IsDate(Me.TxtData.Text) = True Then
         If CDate(TxtData.Value) > Format(Date, "dd/mm/yyyy") Then
          MsgBox "O Ano da Data " & TxtData & " é Maior que " & Date, vbCritical, "AVISO"
          TxtData = ""
          TxtData.SetFocus
         Else
         End If
        End If
    End Sub
    Private Sub TxtData_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    TxtData.MaxLength = 10
     Select Case KeyAscii
       Case 8, 48 To 57 ' BackSpace e numericos
        If Len(TxtData) = 2 Then TxtData.Text = TxtData.Text & "/"
        If Len(TxtData) = 5 Then TxtData.Text = TxtData.Text & "/"
        Me.TxtData.SelStart = VBA.Len(Me.TxtData.Value)
        'End If
        Case Else ' o resto é travado
        KeyAscii = 0
       End Select
    End Sub
    Obrigado.

    Coloque assim no Format

    Format(TxtData, "dd/MM/yyyy")

    em vez de 32/11/13 coloque 32/11/2013

    ai me fala o que aconteceu?


    Fulvio Cezar Canducci Dias


    domingo, 22 de dezembro de 2013 01:03
  • boa tarde

    Caro Fúlvio, desta forma com 4 digito funciona. Porém, são varias planilha e varias pessoas digitando, alguem pode digitar com 2 digito e passar o erro sem perceber.

    obrigado. 


    • Editado JLNunes domingo, 22 de dezembro de 2013 18:08
    domingo, 22 de dezembro de 2013 18:07
  • boa tarde

    Caro Fúlvio, desta forma com 4 digito funciona. Porém, são varias planilha e varias pessoas digitando, alguem pode digitar com 2 digito e passar o erro sem perceber.

    obrigado. 


    JLNunes, então foi resolvido, porque se ele funciona e pega a data no formato que eu te falei é só mandar um splash dizendo que o formato da data é com 4 digitos !!! OK?



    Fulvio Cezar Canducci Dias

    domingo, 22 de dezembro de 2013 22:33
  • JLNunes,

    Minha contribuição aqui não responde, tecnicamente, sua pergunta original.

    Já quebrei muitas vezes a cabeça criando dezenas de funções que monitoram o pressionamento de teclas e valide um campo de formulário digitado por um usuário. Cheguei à conclusão que isso é desperdício de energia do programador.

    A melhor forma de validar os campos de um formulário é no ato do usuário pressionar o OK.

    Em seu caso específico, você reduziria todo seu trabalho (e risco do código transformar datas válidas em coisas malucas, por exemplo) em:

    If Not IsDate(Me.TxtData.Text) Then
      MsgBox "Favor inserir uma data válida!", vbCritical
      Exit Sub
    End if

    Sugiro simplificar seu código.

    ---

    Alternativamente, que tal retirar o poder do usuário em editar uma data? Crie um controle Label e um botão de comando. Assim que o usuário clicar no botão de comando, um calendário pop-up abrirá para ele escolher uma data. Veja um calendário pop-up em: http://www.ambienteoffice.com.br/officevba/calendario_pop-up/


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 24 de dezembro de 2013 00:58
    Moderador
  • boa noite

    usei este procedimento e ele se comportou igual ao anterior

    If Not IsDate(Me.TxtData.Text) Then
      MsgBox
    "Favor inserir uma data válida!", vbCritical
     
    Exit Sub
    End if

    é igual a este

    Private Sub TxtData_Exit(ByVal Cancel As MSForms.ReturnBoolean)
       
    TxtData.BackColor = vbWhite
       
    TxtData = Format(TxtData, "dd/mm/yyyy")
       
    If IsDate(Me.TxtData.Text) = False Then
        
    MsgBox " A Data " & TxtData & " é Inválida", vbCritical, "AVISO"
        
    TxtData = ""
        
    TxtData.SetFocus
        
    Else
       
    End If
    end

    vou tentar adaptar o calendario do enderço  http://www.ambienteoffice.com.br/officevba/calendario_pop-up/ ao arquivo.

    Obrigado.

    • Marcado como Resposta JLNunes sexta-feira, 27 de dezembro de 2013 23:56
    sexta-feira, 27 de dezembro de 2013 23:55
  • Amigo.

    Por acaso já tentou colocar a data desta forma?

    Private Sub TextBox2_data_Change()
    
    If Len(TextBox2_data) = 2 Or Len(TextBox2_data) = 5 Then
    TextBox2_data.Text = TextBox2_data.Text & "/"
    SendKeys "{End}", True
    End If
    End Sub

    Depois coloca no codigo um

    if len(textbox2_data.value)<>10 then
    
    textbox2_data.value=""
    
    textbox2_data.setfocus
    
    end if

    Se quiser o ano com dois digitos, pode definir as carateristicas da textbox para 8 carateres

    Cumprimentos

    M_A_L


    • Editado M_A_S_L domingo, 29 de dezembro de 2013 01:15
    domingo, 29 de dezembro de 2013 01:04