Ir para conteúdo

Arquivado

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

gabrieldb

[Resolvido] Validação de CPF/CNPJ

Recommended Posts

Boa tarde pessoal eu aqui mais uma vez, meu problema é o seguinte peguei na internet uma função que valida CPF/CNPJ porém no código ela estava com maskedbox eu mudei para text porque não gosto da masked, mais agora dá sempre como CPF/CNPJ inválido alguém pode dar uma olhada no meu código e ver o que está errado ?

 

Coloquei em um módulo a função.

 

Function calculacpf(CPF As String) As Boolean
On Error GoTo Err_CPF
Dim I As Integer 'utilizada nos FOR... NEXT
Dim strcampo As String 'armazena do CPF que será utilizada para o cálculo
Dim strCaracter As String 'armazena os digitos do CPF da direita para a esquerda
Dim intNumero As Integer 'armazena o digito separado para cálculo (uma a um)
Dim intMais As Integer 'armazena o digito específico multiplicado pela sua base
Dim lngSoma As Long 'armazena a soma dos digitos multiplicados pela sua base(intmais)
Dim dblDivisao As Double 'armazena a divisão dos digitos*base por 11
Dim lngInteiro As Long 'armazena inteiro da divisão
Dim intResto As Integer 'armazena o resto
Dim intDig1 As Integer 'armazena o 1º digito verificador
Dim intDig2 As Integer 'armazena o 2º digito verificador
Dim strConf As String 'armazena o digito verificador

lngSoma = 0
intNumero = 0
intMais = 0
strcampo = Left(CPF, 9)

'Inicia cálculos do 1º dígito
For I = 2 To 10
    strCaracter = Right(strcampo, I - 1)
    intNumero = Left(strCaracter, 1)
    intMais = intNumero * I
    lngSoma = lngSoma + intMais
Next I
dblDivisao = lngSoma / 11

lngInteiro = Int(dblDivisao) * 11
intResto = lngSoma - lngInteiro
If intResto = 0 Or intResto = 1 Then
    intDig1 = 0
Else
    intDig1 = 11 - intResto
End If

strcampo = strcampo & intDig1 'concatena o CPF com o primeiro digito verificador
lngSoma = 0
intNumero = 0
intMais = 0
'Inicia cálculos do 2º dígito
For I = 2 To 11
    strCaracter = Right(strcampo, I - 1)
    intNumero = Left(strCaracter, 1)
    intMais = intNumero * I
    lngSoma = lngSoma + intMais
Next I
dblDivisao = lngSoma / 11
lngInteiro = Int(dblDivisao) * 11
intResto = lngSoma - lngInteiro
If intResto = 0 Or intResto = 1 Then
    intDig2 = 0
Else
    intDig2 = 11 - intResto
End If
strConf = intDig1 & intDig2
'Caso o CPF esteja errado dispara a mensagem
If strConf <> Right(CPF, 2) Then
    calculacpf = False
Else
    calculacpf = True
End If
Exit Function

Exit_CPF:
    Exit Function
Err_CPF:
    MsgBox Error$
    Resume Exit_CPF
End Function


Public Function CalculaCGC(Numero As String) As String

Dim I As Integer
Dim prod As Integer
Dim mult As Integer
Dim digito As Integer

If Not IsNumeric(Numero) Then
   CalculaCGC = ""
   Exit Function
End If

mult = 2
For I = Len(Numero) To 1 Step -1
  prod = prod + Val(Mid(Numero, I, 1)) * mult
  mult = IIf(mult = 9, 2, mult + 1)
Next

digito = 11 - Int(prod Mod 11)
digito = IIf(digito = 10 Or digito = 11, 0, digito)

CalculaCGC = Trim(Str(digito))

End Function
Public Function ValidaCGC(CGC As String) As Boolean
If CalculaCGC(Left(CGC, 12)) <> Mid(CGC, 13, 1) Then
   ValidaCGC = False
   Exit Function
End If

If CalculaCGC(Left(CGC, 13)) <> Mid(CGC, 14, 1) Then
   ValidaCGC = False
   Exit Function
End If

ValidaCGC = True

End Function

E no form pra verificar meu código tá assim.

 

Private Sub Text1_LostFocus()
    If Len(Text1.Text) > 0 Then
      Select Case Len(Text1.Text)
       Case Is = 11
         Text1.Text = Format$(Text1.Text, "@@@.@@@.@@@-@@")
         If Not calculacpf(Text1.Text) Then
            MsgBox "CPF com DV incorreto !!!"
            Text1 = ""
            Text1.Text = ""
            Text1.SetFocus
         End If
       Case Is = 14
         Text1.Text = Format$(Text1.Text, "@@.@@@.@@@/@@@@-@@")
         If Not ValidaCGC(Text1.Text) Then
            MsgBox "CGC com DV incorreto !!! "
            Text1 = ""
            Text1.Text = ""
            Text1.SetFocus
         End If
      End Select
    End If
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
  'Se teclar enter envia um TAB
  If KeyAscii = 13 Then
     SendKeys "{TAB}"
     KeyAscii = 0
  End If
End Sub

 

Desde já agradeço pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tira a formatação do CPF, provavelmente no CNPJ também deve ser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tira a formatação do CPF, provavelmente no CNPJ também deve ser.

 

Então mais se eu tirar a formatação como faço pra por ela de volta sem ser com maskedbox ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, como você colocou num textbox, ele conta os pontos, traços e barras dos CPF/CNPJ como string.

Ai quando você fez isso aqui:

strcampo = Left(CPF, 9)
Se seu cpf for por exemplo "123.456.789-01", a variável strCampo vai ficar "123.456.7".

 

Você precisa ajustar sua função para considerar as posições dos pontos ou fazer o que o Scorpio disse, retirar tudo.

 

Se retirar, depois para por você pode usar o mid:

 

CPF = mid(cpf,1,3) & "." & mid(cpf,4,3) & "." & mid(cpf,7,3) & "-" & rigth(cpf,2)

 

Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok Cláudio, vou tentar arrumar ela aqu, qualquer coisa volto a postar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, como você colocou num textbox, ele conta os pontos, traços e barras dos CPF/CNPJ como string.

Ai quando você fez isso aqui:

strcampo = Left(CPF, 9)
Se seu cpf for por exemplo "123.456.789-01", a variável strCampo vai ficar "123.456.7".

 

Você precisa ajustar sua função para considerar as posições dos pontos ou fazer o que o Scorpio disse, retirar tudo.

 

Se retirar, depois para por você pode usar o mid:

 

CPF = mid(cpf,1,3) & "." & mid(cpf,4,3) & "." & mid(cpf,7,3) & "-" & rigth(cpf,2)

 

Boa sorte.

 

Tentei fazer de tudo aqui Cláudio mais nada deu certo, ele não assume o formato "123.456.789-10" não dá erro mais só que fica "12345678910", como faço ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem que ter dado certo cara.

 

Onde você colocou o código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem que ter dado certo cara.

 

Onde você colocou o código?

 

 

Onde e como?

 

Eu coloquei no lostfocus do text, não sei se coloquei no lugar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode estar no lugar certo sim. Poste o código para vermos como ficou

 

ai vai o código do lostfocus

 

Private Sub Maskcpfcgc_LostFocus()
    If Len(Maskcpfcgc.Text) > 0 Then
      Select Case Len(Maskcpfcgc.Text)
       Case Is = 11
        CPF = Mid(CPF, 1, 3) & "." & Mid(CPF, 4, 3) & "." & Mid(CPF, 7, 3) & "-" & Right(CPF, 2)
         If Not calculacpf(Maskcpfcgc.Text) Then
            MsgBox "CPF com DV incorreto !!!"
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
       Case Is = 14
         Maskcpfcgc.Text = Format$(Maskcpfcgc, "@@.@@@.@@@/@@@@-@@")
         If Not ValidaCGC(Maskcpfcgc.Text) Then
            MsgBox "CGC com DV incorreto !!! "
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
      End Select
    End If
End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué Gabriel. Você colocou a máscara na variavel CPF, mas não passou o valor dela para o maskedbox.

 

Por isso não deu certo.

 

Mais como eu faço isso ? Agora tá dando como type mismatch e dando inválido, mais eu não to usando maskedbox e sim text por isso eu disse eu substitui o masked por text por isso o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse objeto (Maskcpfcgc) é um text ou uma masked?

 

Para passar o valor basta fazer

Private Sub Maskcpfcgc_LostFocus()
    If Len(Maskcpfcgc.Text) > 0 Then
      Select Case Len(Maskcpfcgc.Text)
       Case Is = 11
        CPF = Mid(CPF, 1, 3) & "." & Mid(CPF, 4, 3) & "." & Mid(CPF, 7, 3) & "-" & Right(CPF, 2)
         If Not calculacpf(Maskcpfcgc.Text) Then
            MsgBox "CPF com DV incorreto !!!"
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
       Case Is = 14
         Maskcpfcgc.Text = Format$(Maskcpfcgc, "@@.@@@.@@@/@@@@-@@")
         If Not ValidaCGC(Maskcpfcgc.Text) Then
            MsgBox "CGC com DV incorreto !!! "
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
      End Select
      Maskcpfcgc = Cpf
    End If
End Sub

Poste sua funcao CalculaCPF e ValidaCGC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse objeto (Maskcpfcgc) é um text ou uma masked?

è uma text

 

ai vai minha função..

 

Function calculacpf(CPF As String) As Boolean
'Esta rotina foi adaptada da revista Fórum Access
On Error GoTo Err_CPF
Dim I As Integer 'utilizada nos FOR... NEXT
Dim strcampo As String 'armazena do CPF que será utilizada para o cálculo
Dim strCaracter As String 'armazena os digitos do CPF da direita para a esquerda
Dim intNumero As Integer 'armazena o digito separado para cálculo (uma a um)
Dim intMais As Integer 'armazena o digito específico multiplicado pela sua base
Dim lngSoma As Long 'armazena a soma dos digitos multiplicados pela sua base(intmais)
Dim dblDivisao As Double 'armazena a divisão dos digitos*base por 11
Dim lngInteiro As Long 'armazena inteiro da divisão
Dim intResto As Integer 'armazena o resto
Dim intDig1 As Integer 'armazena o 1º digito verificador
Dim intDig2 As Integer 'armazena o 2º digito verificador
Dim strConf As String 'armazena o digito verificador

lngSoma = 0
intNumero = 0
intMais = 0
strcampo = Left(CPF, 9)

'Inicia cálculos do 1º dígito
For I = 2 To 10
    strCaracter = Right(strcampo, I - 1)
    intNumero = Left(strCaracter, 1)
    intMais = intNumero * I
    lngSoma = lngSoma + intMais
Next I
dblDivisao = lngSoma / 11

lngInteiro = Int(dblDivisao) * 11
intResto = lngSoma - lngInteiro
If intResto = 0 Or intResto = 1 Then
    intDig1 = 0
Else
    intDig1 = 11 - intResto
End If

strcampo = strcampo & intDig1 'concatena o CPF com o primeiro digito verificador
lngSoma = 0
intNumero = 0
intMais = 0
'Inicia cálculos do 2º dígito
For I = 2 To 11
    strCaracter = Right(strcampo, I - 1)
    intNumero = Left(strCaracter, 1)
    intMais = intNumero * I
    lngSoma = lngSoma + intMais
Next I
dblDivisao = lngSoma / 11
lngInteiro = Int(dblDivisao) * 11
intResto = lngSoma - lngInteiro
If intResto = 0 Or intResto = 1 Then
    intDig2 = 0
Else
    intDig2 = 11 - intResto
End If
strConf = intDig1 & intDig2
'Caso o CPF esteja errado dispara a mensagem
If strConf <> Right(CPF, 2) Then
    calculacpf = False
Else
    calculacpf = True
End If
Exit Function

Exit_CPF:
    Exit Function
Err_CPF:
    MsgBox Error$
    Resume Exit_CPF
End Function

Public Function CalculaCGC(Numero As String) As String

Dim I As Integer
Dim prod As Integer
Dim mult As Integer
Dim digito As Integer

If Not IsNumeric(Numero) Then
   CalculaCGC = ""
   Exit Function
End If

mult = 2
For I = Len(Numero) To 1 Step -1
  prod = prod + Val(Mid(Numero, I, 1)) * mult
  mult = IIf(mult = 9, 2, mult + 1)
Next

digito = 11 - Int(prod Mod 11)
digito = IIf(digito = 10 Or digito = 11, 0, digito)

CalculaCGC = Trim(Str(digito))

End Function

Public Function ValidaCGC(CGC As String) As Boolean
If CalculaCGC(Left(CGC, 12)) <> Mid(CGC, 13, 1) Then
   ValidaCGC = False
   Exit Function
End If

If CalculaCGC(Left(CGC, 13)) <> Mid(CGC, 14, 1) Then
   ValidaCGC = False
   Exit Function
End If

ValidaCGC = True

End Function

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio consegui resolver já , valeu pelas dicas eu fiz assim, cloquei um replace ai vai meu código se alguem precisar, só usar junto com a função acima.

 

Private Sub Maskcpfcgc_LostFocus()
    If Len(Maskcpfcgc.Text) > 0 Then
      Select Case Len(Maskcpfcgc.Text)
       Case Is = 11
         Maskcpfcgc.Text = Format$(Maskcpfcgc, "@@@.@@@.@@@-@@")
      Dim xxxx As String
       xxxx = Replace(Maskcpfcgc.Text, ".", "")
       xxxx = Replace(xxxx, "-", "")
       xxxx = Replace(xxxx, "/", "")
         If Not calculacpf(xxxx) Then
            MsgBox "CPF com DV incorreto !!!"
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
       Case Is = 14
         Maskcpfcgc.Text = Format$(Maskcpfcgc, "@@.@@@.@@@/@@@@-@@")
       Dim xxx As String
       xxx = Replace(Maskcpfcgc.Text, ".", "")
       xxx = Replace(xxx, "-", "")
       xxx = Replace(xxx, "/", "")
     If Not ValidaCGC(xxx) Then
            MsgBox "CGC com DV incorreto !!! "
            Maskcpfcgc = ""
            Maskcpfcgc.Text = ""
            Maskcpfcgc.SetFocus
         End If
      End Select
    End If
End Sub

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.