Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 IfPrivate 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.
>
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 ?
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.
Ok Cláudio, vou tentar arrumar ela aqu, qualquer coisa volto a postar.
>
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 ?
Tem que ter dado certo cara.
Onde você colocou o código?
Onde e como?
>
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.
Pode estar no lugar certo sim. Poste o código para vermos como ficou
>
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 IfUé 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.
>
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.
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 IfPoste sua funcao CalculaCPF e ValidaCGC
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
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
Tira a formatação do CPF, provavelmente no CNPJ também deve ser.