Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fagnerx21

Problemas com validação de cpf !

Recommended Posts

Olá a todos,eu estou tentando implementar um código para validar o cpf no evento lostfocus(),mas quando eu testo,se eu deixar o campo vazio ele dá pau,já tentei tratar isso mas não deu certo, o código está aí:

 

Public Function fuValidaCpf(cpf As String) As Boolean

Dim i As Integer

Dim campo As String 'armazena o CPF que será utilizada para o cálculo

Dim caracter As String 'armazena os digitos do CPF da direita para a esquerda

Dim numero As Integer 'armazena o digito separado para cálculo (uma a um)

Dim mais As Integer 'armazena o digito específico multiplicado pela sua base

Dim soma As Long 'armazena a soma dos digitos multiplicados pela sua base(mais)

Dim divisao As Double 'armazena a divisão dos digitos*base por 11

Dim inteiro As Long 'armazena inteiro da divisão

Dim resto As Integer 'armazena o resto

Dim dig1 As Integer 'armazena o 1º digito verificador

Dim dig2 As Integer 'armazena o 2º digito verificador

Dim conf As String 'armazena o digito verificador

 

'Verifica se o cpf é vazio

If cpf = "" Then

'Então abandona a função

Exit Function

End If

 

soma = 0

numero = 0

mais = 0

campo = Left(cpf, 9)

 

'Inicia cálculos do 1º dígito

For i = 2 To 10

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig1 = 0

Else

dig1 = 11 - resto

End If

 

campo = campo & dig1

soma = 0

numero = 0

mais = 0

 

'Inicia cálculos do 2º dígito

For i = 2 To 11

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig2 = 0

Else

dig2 = 11 - resto

End If

 

conf = dig1 & dig2

 

'Caso o CPF esteja errado dispara a mensagem

If conf <> Right(cpf, 2) Then

fuValidaCpf = False

Else

fuValidaCpf = True

End If

Exit Function

End Function

Código do maskedbox:

 

If Not fuValidaCpf(mskCpf) Then

MsgBox "CPF incorreto !"

mskCpf = ""

Call fuFormataCpf(mskCpf)

mskCpf.SetFocus

Exit Sub

End If

Por favor,será que alguém pode me ajudar???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte, se o campo estiver vazio, você nem precisa perder tempo chamando sua função. Então faça sua comparação se é vazio no evento lostfocus de sua maskedbox.

 

Mas o que acontece é o seguinte, quando você utiliza um maskedbox, e define uma máscara para ele, esse condição (maskedbox.text = "") nunca será verdadeira.

 

O que você precisa fazer antes de verificar se é vazia é, retirar a máscara, ai fica assim:

 

CODE

mskCPF.mask = ""

if mskCPF.text <> "" then

'função verifica cpf

end if

 

Depois eu não entendi o que você fez. Se a função for falsa, você mostra uma mensagem e depois chama uma função. O que faz essa outra função (fuFormataCpf)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,valeu ae,essa função é o seguinte:

Public Sub fuFormataCpf(campo As MaskEdBox)

'Formata o campo cpf

campo.Mask = "###.###.###-##"

End Sub

 

Ou seja,se não obedecer a condição vai limpar o campo e formata com . e -

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora está acontecendo o seguinte,ele verifica se está preenchido e valida o cpf,mas mesmo quando eu coloco um cpf seja ele válido ou inválido está fazendo a mesma coisa,limpa o campo,retorna a cor original e poe foco no próximo campo,o código está assim:

 

Private Sub mskCpf_LostFocus()

mskCpf.Mask = " "

If mskCpf.Text <> " " Then

If Not fuValidaCpf(mskCpf) Then

MsgBox "CPF incorreto !"

mskCpf = ""

Call fuFormataCpf(mskCpf)

mskCpf.SetFocus

Exit Sub

End If

End If

Call fuLimpaCpf(mskCpf)

Call fuTiraFoco(mskCpf)

End Sub

Então aonde estava If mskCpf.Text <> " " Then eu deixei assim:

If mskCpf.Text <> "" Then

Mas gerou o seguinte erro:

"Run-time error '13': Type mismatch"

 

Então como eu faria para verificar se o cpf está preenchido e validar corretamente sem gerar esse erro?por favor me ajudem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, fiquei com uma dúvida, sua maskedbox está com máscara quando você digita os números?

 

Estou perguntando porque recebi o erro Type Mismatch, mas eu recebi porque coloquei máscara na masked, ai deu erro quando tentou passar o caracter "." para uma variável declarada como integer.

 

Rode seu programa apertando F8, vá olhando onde estão ocorrendo os erros que fica mais fácil você achar.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei debugar,e na linha que está em negrito é a que deu erro:

 

Public Function fuValidaCpf(cpf As String) As Boolean

Dim i As Integer

Dim campo As String 'armazena o CPF que será utilizada para o cálculo

Dim caracter As String 'armazena os digitos do CPF da direita para a esquerda

Dim numero As Integer 'armazena o digito separado para cálculo (uma a um)

Dim mais As Integer 'armazena o digito específico multiplicado pela sua base

Dim soma As Long 'armazena a soma dos digitos multiplicados pela sua base(mais)

Dim divisao As Double 'armazena a divisão dos digitos*base por 11

Dim inteiro As Long 'armazena inteiro da divisão

Dim resto As Integer 'armazena o resto

Dim dig1 As Integer 'armazena o 1º digito verificador

Dim dig2 As Integer 'armazena o 2º digito verificador

Dim conf As String 'armazena o digito verificador

 

soma = 0

numero = 0

mais = 0

campo = Left(cpf, 9)

 

'Inicia cálculos do 1º dígito

For i = 2 To 10

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig1 = 0

Else

dig1 = 11 - resto

End If

 

campo = campo & dig1

soma = 0

numero = 0

mais = 0

 

'Inicia cálculos do 2º dígito

For i = 2 To 11

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig2 = 0

Else

dig2 = 11 - resto

End If

 

conf = dig1 & dig2

 

'Caso o CPF esteja errado dispara a mensagem

If conf <> Right(cpf, 2) Then

fuValidaCpf = False

Else

fuValidaCpf = True

End If

Exit Function

End Function

É nessa linha que dá o erro de type mismatch,seria esse erro por causa que minha masked está mascarada com "###.###.###-##"?

A solução nesse caso seria tirar a máscara?ou existe uma maneira de tratar isso,enquanto eu espero pela sua resposta vou testando aqui sem máscara para ver se dá certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops, desculpe.

 

Então, é no mesmo lugar que eu estava recebendo meu erro, mas eu deixei a masked com máscara definida (###.###.###-##).

 

Por isso estava dando erro, porque ao fazer

numero = Left(caracter, 1), chegou certo caracter que era um ponto ".", e número você declarou como integer, logo não recebe o caracter ".".

 

Para evitar isso, você precisará passar somente números para a masked.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aff,desisti de validar o cpf,fiquei tempo demais empacado nisso,olha como tá o meu código:

Public Function fuValidaCpf(cpf As String) As Boolean

Dim i As Integer

Dim campo As String 'armazena o CPF que será utilizada para o cálculo

Dim caracter As String 'armazena os digitos do CPF da direita para a esquerda

Dim numero As Integer 'armazena o digito separado para cálculo (uma a um)

Dim mais As Integer 'armazena o digito específico multiplicado pela sua base

Dim soma As Long 'armazena a soma dos digitos multiplicados pela sua base(mais)

Dim divisao As Double 'armazena a divisão dos digitos*base por 11

Dim inteiro As Long 'armazena inteiro da divisão

Dim resto As Integer 'armazena o resto

Dim dig1 As Integer 'armazena o 1º digito verificador

Dim dig2 As Integer 'armazena o 2º digito verificador

Dim conf As String 'armazena o digito verificador

 

soma = 0

numero = 0

mais = 0

campo = Left(cpf, 9)

 

'Inicia cálculos do 1º dígito

For i = 2 To 10

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig1 = 0

Else

dig1 = 11 - resto

End If

 

campo = campo & dig1

soma = 0

numero = 0

mais = 0

 

'Inicia cálculos do 2º dígito

For i = 2 To 11

caracter = Right(campo, i - 1)

numero = Left(caracter, 1)

mais = numero * i

soma = soma + mais

Next i

 

divisao = soma / 11

inteiro = Int(divisao) * 11

resto = soma - inteiro

 

If resto = 0 Or resto = 1 Then

dig2 = 0

Else

dig2 = 11 - resto

End If

 

conf = dig1 & dig2

 

'Caso o CPF esteja errado dispara a mensagem

If conf <> Right(cpf, 2) Then

fuValidaCpf = False

Else

fuValidaCpf = True

End If

Exit Function

End Function

Private Sub mskCpf_GotFocus()

Call fuDaFoco(mskCpf)

Call fuFormataCpf(mskCpf)

End Sub

 

Public Sub fuDaFoco(campo As Object)

'Seleciona todo o texto

campo.SelStart = 0

campo.SelLength = Len(campo)

'Muda a cor do campo

campo.BackColor = &HC0FFFF

End Sub

 

Public Sub fuFormataCpf(campo As MaskEdBox)

'Formata o campo cpf

campo.Mask = "###########"

End Sub

Private Sub mskCpf_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then

Call fuPulaFoco(mskNascimento)

End If

End Sub

 

Public Sub fuPulaFoco(campo As Object)

campo.SetFocus

End Sub

Private Sub mskCpf_LostFocus()

mskCpf.Mask = " "

If mskCpf.Text <> "" Then

If Not fuValidaCpf(mskCpf) Then

MsgBox "CPF incorreto !"

mskCpf = ""

Call fuFormataCpf(mskCpf)

mskCpf.SetFocus

Exit Sub

End If

End If

Call fuLimpaCpf(mskCpf)

Call fuTiraFoco(mskCpf)

End Sub

 

Public Sub fuFormataCpf(campo As MaskEdBox)

'Formata o campo cpf

campo.Mask = "###########"

End Sub

 

Public Sub fuLimpaCpf(campo As MaskEdBox)

campo.Text = " "

End Sub

 

Public Sub fuTiraFoco(campo As Object)

'Muda a cor do campo

campo.BackColor = &H80000005

End Sub

Se você puder me ajudar beleza,senão deixa quieto,já quebrei a cabeça demais por uma validação de cpf,tá certo,também essa é a minha primeira vez então é normal acontecer isso,mas de qualquer forma eu lhe agradeço por toda a ajuda.

Muito Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta esse código, veja se funfa:

 

Pode usar uma text mesmo para isso, não precisa ser masked. Faz muito tempo que fiz esse código, não lembro exatamente de tudo que está nele, então se der algum errinho, me avise que procuro a correção para você.

 

Ah, no meu caso, tanto podia ser digitado um CPF quanto um CNPJ na text, então o código já verifica automaticamente se é um ou outro e preenche da forma correta. No seu caso como isso não é preciso, se conseguir, apague essa parte do código.

 

CODE

Private Sub txtCNPJ_GotFocus()

On Error GoTo Trata_Erro

 

txtCNPJ.SelStart = 0

txtCNPJ.SelLength = Len(Screen.ActiveControl.Text)

 

txtCNPJ.MaxLength = 18

 

Exit Sub

Trata_Erro:

Call MensagemDeErro

End Sub

 

Private Sub txtCNPJ_KeyPress(KeyAscii As Integer)

If KeyAscii <> 8 And (KeyAscii < 48 Or KeyAscii > 57) Then

KeyAscii = 0

End If

End Sub

 

Private Sub txtCNPJ_LostFocus()

On Error GoTo Trata_Erro

Dim calcCPF As Integer

Dim arrCPF(1 To 14) As String

Dim verCPF As Integer

Dim auxCPF As Integer

 

 

rs_cli.MoveFirst

With txtCNPJ

If .Text = "" Then

Else

If Mid(.Text, 3, 1) <> "." And Mid(.Text, 15, 1) <> "" Then

MsgBox "Há números digitados a mais", vbInformation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Else

If Mid(.Text, 12, 1) <> "" And Mid(.Text, 14, 1) = "" Then

MsgBox "A quantidade de dígitos não confere", vbInformation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

Else

If Mid(.Text, 12, 1) = "" Then

 

For auxCPF = 1 To 11 Step 1

arrCPF(auxCPF) = Mid(.Text, auxCPF, 1)

If arrCPF(auxCPF) = "" Then

MsgBox "Faltam dígitos no CPF digitado", vbInformation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

End If

Next

 

.Text = arrCPF(1) & arrCPF(2) & arrCPF(3) & "." & arrCPF(4) & arrCPF(5) & arrCPF(6) & "." & arrCPF(7) & arrCPF(8) & arrCPF(9) & "-" & arrCPF(10) & arrCPF(11)

 

auxCPF = Len(txtCNPJ)

 

If arrCPF(10) = (((arrCPF(9) * 9 + arrCPF(8) * 8 + arrCPF(7) * 7 _

+ arrCPF(6) * 6 + arrCPF(5) * 5 + arrCPF(4) * 4 + arrCPF(3) _

* 3 + arrCPF(2) * 2 + arrCPF(1) * 1) Mod 11) Mod 10) Then

 

Else

MsgBox "Há um erro no CPF informado", vbExclamation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

End If

 

If arrCPF(11) = (((arrCPF(10) * 9 + arrCPF(9) * 8 + arrCPF(8) * 7 _

+ arrCPF(7) * 6 + arrCPF(6) * 5 + arrCPF(5) * 4 + arrCPF(4) _

* 3 + arrCPF(3) * 2 + arrCPF(2) * 1) Mod 11) Mod 10) Then

 

Else

MsgBox "Há um erro no CPF informado", vbExclamation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

End If

Else

If (Mid(.Text, 4, 1) = "." And Mid(.Text, 12, 1) = "-") Then

 

For auxCPF = 1 To 14 Step 1

arrCPF(auxCPF) = Mid(.Text, auxCPF, 1)

Next

 

If arrCPF(13) = (((arrCPF(11) * 9 + arrCPF(10) * 8 + arrCPF(9) * 7 _

+ arrCPF(7) * 6 + arrCPF(6) * 5 + arrCPF(5) * 4 + arrCPF(3) _

* 3 + arrCPF(2) * 2 + arrCPF(1) * 1) Mod 11) Mod 10) Then

 

Else

If (((arrCPF(11) * 9 + arrCPF(10) * 8 + arrCPF(9) * 7 _

+ arrCPF(7) * 6 + arrCPF(6) * 5 + arrCPF(5) * 4 + arrCPF(3) _

* 3 + arrCPF(2) * 2 + arrCPF(1) * 1) Mod 11) Mod 10) = 10 And arrCPF(10) = 0 Then

 

Else

MsgBox "Há um erro no CPF informado", vbExclamation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

End If

End If

 

If arrCPF(14) = ((arrCPF(13) * 9 + arrCPF(11) * 8 + arrCPF(10) * 7 _

+ arrCPF(9) * 6 + arrCPF(7) * 5 + arrCPF(6) * 4 + arrCPF(5) _

* 3 + arrCPF(3) * 2 + arrCPF(2) * 1) Mod 11) Then

 

Else

MsgBox "Há um erro no CPF informado", vbExclamation, "Alerta"

.SetFocus

.SelStart = 0

.SelLength = Len(Screen.ActiveControl.Text)

Exit Sub

End If

Else

If (Mid(.Text, 3, 1) = "." And Mid(.Text, 11, 1) = "/") Then

 

Else

If Mid(.Text, 14, 1) <> "" Then

 

For auxCPF = 1 To 14 Step 1

arrCPF(auxCPF) = Mid(txtCNPJ, auxCPF, 1)

Next

 

.Text = arrCPF(1) + arrCPF(2) + "." + arrCPF(3) + arrCPF(4) + arrCPF(5) + "." + arrCPF(6) _

+ arrCPF(7) + arrCPF(8) + "/" + arrCPF(9) + arrCPF(10) + arrCPF(11) + arrCPF(12) + "-" + arrCPF(13) + arrCPF(14)

End If

End If

End If

End If

End If

End If

 

End If

End With

 

Exit Sub

Trata_Erro:

Call MensagemDeErro

End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,nessa linha If .Text = "" Then

Else

 

Não deveria ter algo entre o Then e o Else?digo isso porque estou testando e dá dando mensagem de erro "Object Required"

 

Outra coisa,no Key_Press seu faz uma verificação de teclas,mas eu queria incluir mais uma verificação para verificar se o usuário teclou Enter então dar foco no próximo campo,a função ficou assim:

CODE
Private Sub txtCNPJ_KeyPress(KeyAscii As Integer)

If KeyAscii <> 8 And (KeyAscii < 48 Or KeyAscii > 57) Then

KeyAscii = 0

ElseIf KeyAscii = 13 Then

Call fuPulaFoco(mskNascimento)

End If

End Sub

Mas quando eu teclo enter não está acontecendo nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que tem na função fuPulaFoco ? Provavelmente o problema está lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,nessa linha If .Text = "" Then

Else

 

Não deveria ter algo entre o Then e o Else?digo isso porque estou testando e dá dando mensagem de erro "Object Required"

 

Outra coisa,no Key_Press seu faz uma verificação de teclas,mas eu queria incluir mais uma verificação para verificar se o usuário teclou Enter então dar foco no próximo campo,a função ficou assim:

CODE
Private Sub txtCNPJ_KeyPress(KeyAscii As Integer)

If KeyAscii <> 8 And (KeyAscii < 48 Or KeyAscii > 57) Then

KeyAscii = 0

ElseIf KeyAscii = 13 Then

Call fuPulaFoco(mskNascimento)

End If

End Sub

Mas quando eu teclo enter não está acontecendo nada.

 

Não deveria não, eu fiz dessa forma, mas dá no mesmo que fazer if .text <> "" then e não por o else. O Erro está ocorrendo porque ele não reconhece o objeto txtCNPJ, você deve alterar para o nome do objeto seu.

 

Sua função não está dando porque quando você digita enter (asc II = 13) a primeira condição é verdadeira, ai ele envia keyascii = 0

 

Faça assim:

CODE

Private Sub txtCNPJ_KeyPress(KeyAscii As Integer)

If KeyAscii <> 8 And (KeyAscii < 48 Or KeyAscii > 57) Then

If KeyAscii = 13 Then

Call fuPulaFoco(mskNascimento)

else

KeyAscii = 0

end if

End If

End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Naum cara,eu tomei esse cuidado,no nome d meu objeto está txtCNPJ.

 

E a linha que o erro indica é essa mesmo?

If .txt = "" then

 

O erro diz que está tentando usar um objeto que não tem, mas essa linha só usa uma text, e se você tem essa text, não faz muito sentido não.

 

Meu, você tem msn ou Google Talk, quer me adicionar (netobomelindo.msn@hotmail.com para msn ou claudio.rodriguesneto@gmail para GoogleTalk)? Se não tiver Já estamos há muito tempo tentando solucionar esse problema, e está de rosca.

 

Me adiciona e vamos ver se conseguimos finalizar isso de vez.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.