VERIFICAR DATA
Bom dia!
Sabemos que o VB aceita datas no formato DD/MM/YYYY ou MM/DD/YYYY
A questão é que eu não quero no formato MM/DD/YYYY, apenas no DD/MM/YYYY. Como eu faço para verificar isso??
A maneira que faço é sempre converter para DD/MM/YYY. Mas eu gostaria de saber se dá para checar em qual formato está.
[]'s
Sabemos que o VB aceita datas no formato DD/MM/YYYY ou MM/DD/YYYY
A questão é que eu não quero no formato MM/DD/YYYY, apenas no DD/MM/YYYY. Como eu faço para verificar isso??
A maneira que faço é sempre converter para DD/MM/YYY. Mas eu gostaria de saber se dá para checar em qual formato está.
[]'s
Como assim?
Explique melhor!
Explique melhor!
veja este código
Option Explicit
Private Const LOCALE_SSHORTDATE = &H1F
Private Declare Function GetSystemDefaultLCID Lib [Ô]kernel32[Ô] () As Long
Private Declare Function SetLocaleInfo Lib [Ô]kernel32[Ô] Alias [Ô]SetLocaleInfoA[Ô] (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
Private Sub Command1_Click()
Dim lngLocale As Long
lngLocale = GetSystemDefaultLCID()
If SetLocaleInfo(lngLocale, LOCALE_SSHORTDATE, Combo1.Text) = False Then
Label2.Caption = [Ô]Houve um erro ao definir o formato de data ![Ô]
Else
Label2.Caption = [Ô]Formato de data atualizado para [Ô] & Combo1.Text & [Ô] com sucesso ![Ô]
End If
End Sub
Private Sub Form_Load()
With Combo1
.AddItem [Ô][Selecione um formato][Ô]
.AddItem [Ô]MM/dd/yyyy[Ô]
.AddItem [Ô]dd/MM/yyyy[Ô]
.AddItem [Ô]MM-dd-yyyy[Ô]
.AddItem [Ô]dd-MM-yyyy[Ô]
.ListIndex = 0
End With
Label2.Caption = [Ô][Ô]
End Sub
cruzis... eu achava que era mais simples...
Mas era isso mesmo que eu queria saber Marcelo-Treze. Eu pensava que tinha uma forma mais simples de se fazer.
Hj eu faço assim: Supondo que o camarada digitou na txt1 06/20/2010. No meu programa essa data é inválida, pois não está no formato DD / MM / YYY (dia / mês / ano)
Então faço uma conversão automática:
No entanto, o meu objetivo é de avisar o usuário. Então fiz assim:
Ou seja, se o camarada digitar 06/20/2010, essa data é guardada na variável x e é comparada com a mesma data na variável y, só que com o formato modificado para DD / MM / YYYY
Resumindo:
- se o camarada digita 06/20/2010, na variável y ela fica 20/06/2010 ---> Digo para exibir uma mensagem de erro dizendo que a data digitada é inválida (Na verdade é inválida apenas neste formato, mas essa é a intenção. :)
- se o camadata diguta 20/06/2010, no novo formato fica a mesma coisa. Ou seja, o camarada digitou uma data válida (repito, quando digo [Ô]data válida[Ô] estou me referindo ao formato DD / MM / YYYY)
- se for assim: 11/06/2010 ou 06/11/2010, sem problemas. Ambas estão no formado DD / MM / YYYY e são datas válidas.
é isso.
[ ]'s
Mas era isso mesmo que eu queria saber Marcelo-Treze. Eu pensava que tinha uma forma mais simples de se fazer.
Hj eu faço assim: Supondo que o camarada digitou na txt1 06/20/2010. No meu programa essa data é inválida, pois não está no formato DD / MM / YYY (dia / mês / ano)
Então faço uma conversão automática:
txt1.text = format(txt1.text, [Ô]dd/mm/yyyy[Ô])
No entanto, o meu objetivo é de avisar o usuário. Então fiz assim:
Dim x As String
Dim y As String
x = txt1.Text
y = Format(txt1.Text, [Ô]dd/mm/yyyy[Ô])
If x <> y Then
MsgBox [Ô]data inválida[Ô], vbCritical
ElseIf Not IsDate(x) Then [ô]pois o camarada pode digitar 99/99/9999
MsgBox [Ô]data inválida[Ô], vbCritical
End If
Ou seja, se o camarada digitar 06/20/2010, essa data é guardada na variável x e é comparada com a mesma data na variável y, só que com o formato modificado para DD / MM / YYYY
Resumindo:
- se o camarada digita 06/20/2010, na variável y ela fica 20/06/2010 ---> Digo para exibir uma mensagem de erro dizendo que a data digitada é inválida (Na verdade é inválida apenas neste formato, mas essa é a intenção. :)
- se o camadata diguta 20/06/2010, no novo formato fica a mesma coisa. Ou seja, o camarada digitou uma data válida (repito, quando digo [Ô]data válida[Ô] estou me referindo ao formato DD / MM / YYYY)
- se for assim: 11/06/2010 ou 06/11/2010, sem problemas. Ambas estão no formado DD / MM / YYYY e são datas válidas.
é isso.
[ ]'s
colega o simples fato de se fazer isto
teste = Format([Ô]09/20/2010[Ô], [Ô]dd/mm/yyyy[Ô])
MsgBox teste
ou seja se vc digitar 09/20/2010 ele automaticamente converte para 20/09/2010
vc não precisa fazer verificação nenhuma
teste = Format([Ô]09/20/2010[Ô], [Ô]dd/mm/yyyy[Ô])
MsgBox teste
ou seja se vc digitar 09/20/2010 ele automaticamente converte para 20/09/2010
vc não precisa fazer verificação nenhuma
da pra vc travar oq digitado
tipo
Private Sub Objeto_lostfocus()
if not isdate(objeto) then
msgbox [Ô]data invalida[Ô]
end if
end sub
tipo
Private Sub Objeto_lostfocus()
if not isdate(objeto) then
msgbox [Ô]data invalida[Ô]
end if
end sub
Então Marcelo-Treze, o que vc disse é uma verdade. No entanto, no meu caso, preferi exibir uma mensagem para o usuário. Já tive experiências amargas com usuários falando que [Ô]... não foi eu.... o sistema que fez sozinho....[Ô]. Às vezes algumas coisas feitas de forma automática servem como muleta para tentar justificar erros completamente diferentes. Então preferi mostrar o erro e não deixar o VB corrigir automaticamente.
Vamos supor que o camarada queira digitar 06/12/2010, mas por erro de digitação sai como 06/22/2010.
Se eu deixasse o VB corrigir sozinho, ao invés de ser 06/22/2010, ficaria 22 de junho de 2010, bem diferente de 06 de dezembro de 2010, que era a intenção do usuário caso ele não errasse a digitação.
AÃ vem o usuário reclamando que o sistema fez sozinho... que não tem nada a ver com o que ele digitou, bla bla bla... Dentro de uma certa lógica, o danado do usuário acaba ficando com a razão.
Então, ao invés de corrigir automaticamente, prefiro mostrar o erro e que o usuário mesmo corrija. Todo mundo fica feliz. ]
Caro Sacofrito, desta forma o sistema aceita formatos DD / MM / YYYY (ex: 20/06/2010) e também formatos MM / DD / YYYY (ex: 06/20/2010). E minha intenção é somente DD / MM / YYYY.
[]'s
Vamos supor que o camarada queira digitar 06/12/2010, mas por erro de digitação sai como 06/22/2010.
Se eu deixasse o VB corrigir sozinho, ao invés de ser 06/22/2010, ficaria 22 de junho de 2010, bem diferente de 06 de dezembro de 2010, que era a intenção do usuário caso ele não errasse a digitação.
AÃ vem o usuário reclamando que o sistema fez sozinho... que não tem nada a ver com o que ele digitou, bla bla bla... Dentro de uma certa lógica, o danado do usuário acaba ficando com a razão.
Então, ao invés de corrigir automaticamente, prefiro mostrar o erro e que o usuário mesmo corrija. Todo mundo fica feliz. ]
Caro Sacofrito, desta forma o sistema aceita formatos DD / MM / YYYY (ex: 20/06/2010) e também formatos MM / DD / YYYY (ex: 06/20/2010). E minha intenção é somente DD / MM / YYYY.
[]'s
FBUR sua lógica está correta, então pensando nisto, veja a função que desenvolvi pra vc
ela coloca as barras automáticamente, e verifica se o dia ou o mes é valido conforme a digitação, teste veja se ajuda.
acho que vai gostar, teste coloque um dia maior que 31 ou um mes maior que 12 para ver.
ela coloca as barras automáticamente, e verifica se o dia ou o mes é valido conforme a digitação, teste veja se ajuda.
Function CampoDATA(obj As Object, Keyasc As Integer)
If Not ((Keyasc >= Asc([Ô]0[Ô]) And Keyasc <= Asc([Ô]9[Ô])) Or Keyasc = 8) Then
Keyasc = 0
Exit Function
End If
If Keyasc <> 8 Then
If Len(obj.Text) = 2 Then
If Mid(obj.Text, 1, 2) > 31 Then
MsgBox [Ô]digite um dia válido[Ô]
obj.Text = [Ô][Ô]
Keyasc = 0
Else
obj.Text = obj.Text + [Ô]/[Ô]
obj.SelStart = Len(obj.Text)
End If
End If
If Len(obj.Text) = 5 Then
If Mid(obj.Text, 4, 2) > 12 Then
MsgBox [Ô]Digite um mês válido[Ô]
obj.Text = Mid(obj.Text, 1, 3)
obj.SelStart = Len(obj.Text)
Keyasc = 0
Else
obj.Text = obj.Text + [Ô]/[Ô]
obj.SelStart = Len(obj.Text)
End If
End If
End If
End Function
Private Sub Text1_KeyPress(KeyAscii As Integer)
CampoDATA Text1, KeyAscii
End Sub
acho que vai gostar, teste coloque um dia maior que 31 ou um mes maior que 12 para ver.
Também é uma ótima alternativa Marcelo!
Obrigado.
[]'s
Obrigado.
[]'s
Tópico encerrado , respostas não são mais permitidas