... Pague apenas R$47,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Verificação do CPF e do CNPJ

Rotina para verificar se o CPF é válido

O CPF é um número formado por 11 algarismos, sendo que os dois últimos são de controle.

Vamos considerar este número de CPF 836.895.167- 49, como exemplo.

Para se calcular o número de controle do CPF, realizamos primeiro a soma, do seguinte quadro resultante:

10 9 8 7 6 5 4 3 2
8 3 6 8 9 5 1 6 7
80 27 48 56 54 25 4 18 14

 

80 + 27 + 48 + 56 + 54 + 25 + 4 + 18 + 14 = 326

Utilizando a fórmula abaixo, iremos encontrar o primeiro algarismo de controle.

11 - (326 mod 11) = 4

836.895.167- 49

Nota: caso a (soma mod 11) < 2 , o algarismo de controle assume o valor zero (0).

A partir daí, uma nova soma deve ser realizada, incluindo no quadro, o primeiro algarismo de controle encontrado. Veja: 

11 10 9 8 7 6 5 4 3 2
8 3 6 8 9 5 1 6 7 4
88 30 54 64 63 30 5 24 21 8

 

88 + 30 + 54 + 64 + 63 + 30 + 5 + 24 + 21 + 8 = 387

Utilizando a fórmula abaixo, iremos encontrar o segundo algarismo de controle.

11 - (387 mod 11) = 9

836.895.167- 49

Nota: caso a (soma mod 11) < 2 , o algarismo de controle assume  o valor zero (0).

Agora, observe atentamente, a montagem do código que realiza o cálculo de controle, demonstrado na seqüência acima:

Public Function fncCpfValido(CPF) As Boolean
Dim j As Byte, intSoma%, bytControle As Byte, pCPF$
'-------------------------------------------------
'Retira os pontos e o traço, caso sejam utilizados
'--------------------------------------------------
CPF = Replace(CPF, ".", "")
CPF = Replace(CPF, "-", "")
'-------------------------------------------------------------------
'Verifica se tem 11 algarismos.  Se não tiver, sai da função com 
'o valor padrão FALSO
'-------------------------------------------------------------------
If Len(CPF) <> 11 Then Exit Function
'---------------------------
'Realiza a primeira soma
'---------------------------
For j = 1 To 9
    intSoma = intSoma + ((11 - j) * Val(Mid(CPF, j, 1)))
Next
'------------------------------------------
'Armazena o primeiro algarismo de controle
'------------------------------------------
bytControle = IIf((intSoma Mod 11) < 2, 0, (11 - (intSoma Mod 11)))
intSoma = 0
'-----------------------------------------------------------
'Remonta o CPF com o primeiro algarismo de controle calculado
'------------------------------------------------------------
pCPF = left(CPF,9) & bytControle
'---------------------------------
'Realiza a segunda soma
'---------------------------------
For j = 1 To 10
    intSoma = intSoma + ((12 - j) * Val(Mid(pCPF, j, 1)))
Next
'------------------------------------
'Monta o Número de Controle calculado
'-------------------------------------
bytControle = Val(bytControle & IIf((intSoma Mod 11) < 2, 0, (11 - (intSoma Mod 11))))
'-------------------------------------------------------------------------
'Compara o número de controle calculado com o número de controle informado
'e entrega o resultado para função.
'--------------------------------------------------------------------------
fncCpfValido = (bytControle = Val(Right(CPF, 2)))
End Function

No evento Antes de Atualizar do campo CPF, utilize a função de verificação. 

Private Sub CPF_BeforeUpdate(Cancel As Integer)
If fncCpfValido(Me!CPF) = False Then
    MsgBox "CPF inválido...", vbInformation, "Aviso"
    Cancel = True
End If
End Sub

Rotina para verificar se o CNPJ é válido

O CNPJ é composto de 14 algarismos que são divididos em três blocos. No exemplo abaixo, esses blocos estão destacados através de cores:

03.144.633/0001-61

Os dois últimos algarismos, que estão em vermelho, correspondem ao Dígito Verificador.  Para o cálculo do primeiro algarismo do Dígito Verificador, observe o quadro abaixo:

5 4 3 2 9 8 7 6 5 4 3 2
0 3 1 4 4 6 3 3 0 0 0 1
0 12 3 8 36 48 21 18 0 0 0 2

 

Somamos o resultado do quadro:

0 + 12 + 3 + 36 + 48 + 21 + 18 + 0 + 0 + 0 + 2 = 148

O primeiro algarismo do Dígito Verificador é extraído da seguinte fórmula:

11 - (148 mod 11) = 6

Nota: caso a (soma mod 11) < 2, o algarismo do Dígito Verificador assume o valor zero (0).

Para o cálculo do último algarismo, remontamos a grade, incluindo o primeiro algarismo calculado:

6 5 4 3 2 9 8 7 6 5 4 3 2
0 3 1 4 4 6 3 3 0 0 0 1 6
0 15 4 12 8 54 24 21 0 0 0 3 12

 

Somamos os resultados obtidos da grade:

0 + 15 + 4 + 12 + 8 + 54 + 24 + 21 + 0 + 0 + 0 + 3 + 12 = 153

O segundo algarismo do Dígito Verificador é extraído da seguinte fórmula:

11 - (153 mod 11 ) = 1

Nota: caso a (soma mod 11) < 2,  o algarismo do Dígito Verificador assume o valor zero (0).

Observe atentamente, a montagem do código que realiza o cálculo do Dígito Verificador, conforme demonstrado na seqüência acima:

Public Function fncCnpjValido(CNPJ As String) As Boolean
Dim j As Byte, p As Byte, intSoma%, bytDV As Byte, pCNPJ$
'----------------------------------------------------
'Retira pontos, barra e traço, caso sejam utilizados
'-----------------------------------------------------
CNPJ = Replace(CNPJ, ".", "")
CNPJ = Replace(CNPJ, "/", "")
CNPJ = Replace(CNPJ, "-", "")
'-------------------------------------------------------------------
'Verifica se tem 14 algarismos.  Se não tiver, sai da função com
'o valor padrão FALSO
'-------------------------------------------------------------------
If Len(CNPJ) <> 14 Then Exit Function
'---------------------------
'Realiza a primeira soma
'---------------------------
For j = 1 To 12
    p = IIf(j < 5, 6, 14)
    intSoma = intSoma + ((p - j) * Val(Mid(CNPJ, j, 1)))
Next
'----------------------------------------------------
'Armazena o primeiro algarismo do Dígito Verificador
'----------------------------------------------------
bytDV = IIf((intSoma Mod 11) < 2, 0, (11 - (intSoma Mod 11)))
intSoma = 0
'-------------------------------------------------------------------------
'Remonta o CNPJ com o primeiro algarismo do Dígito Verificador calculado
'-------------------------------------------------------------------------
pCNPJ = Left(CNPJ, 12) & bytDV
'------------------------------------------------------------------
'Realiza a segunda soma para encontrar o segundo algarismo do DV
'------------------------------------------------------------------
For j = 1 To 13
    p = IIf(j < 6, 7, 15)
    intSoma = intSoma + ((p - j) * Val(Mid(pCNPJ, j, 1)))
Next
'---------------------------------------------------------
'Monta o número completo do Dígito Verificador calculado
'----------------------------------------------------------
bytDV = Val(bytDV & IIf((intSoma Mod 11) < 2, 0, (11 - (intSoma Mod 11))))
'-------------------------------------------------------------------------
'Compara o número do Dígito Verificador calculado com o número do Dígito
'Verificador informado e o resultado é entregue à função.
'--------------------------------------------------------------------------
fncCnpjValido = (bytDV = Val(Right(CNPJ, 2)))
End Function

No evento Antes de Atualizar do campo CNPJ, utilize a função de verificação. 

Private Sub CNPJ_BeforeUpdate(Cancel As Integer)
If fncCnpjValido(Me!CNPJ) = False Then
    MsgBox "CNPJ inválido...", vbInformation, "Aviso"
    Cancel = True
End If
End Sub

Download

Baixe aqui um aplicativo exemplo, para você testar na prática, as funções propostas.

Sucesso!


 

 


14 comentários

Eduardo Pires   29/09/2014 20:49:58

oi avelino. gostei da explicação. só não entendi como chegou no resultado daquela formula final.
11 - (387 mod 11) = 9, pode explicar mais detalhado?

Marcelo David   30/09/2014 00:03:47

Muito bom! Melhor do que apenas dar pronto é ensinar e isso encontramos mais uma vez aqui!
Parabéns!

Avelino Sampaio   30/09/2014 05:20:43

Eduardo,

a função MOD retorna o RESTO da divisão.

(387 MOD 11) Retorna 2 :::> 11-2 = 9

Sucesso!

Marcio Melo   30/09/2014 14:09:55

Sensacional a forma que explica em como chegar no digito de verificação do CPF, eu tenho uma rotina que achei na internet sem nenhum comentário e bem maior que a sua, sempre tive muita vontade de enxergar como que era feito esse procedimento... Irei passar a utilizar o seu método... muito obrigado por mais uma aula de como minimizar uma rotina....

Sou mais Brasil!

Forte abraço...

Marcio Melo   02/10/2014 08:57:00

Aproveitando que estamos em tempo de eleição, uma função onde faz o teste para ver se o titulo é verdadeiro ou falso:
'Testa Título de Eleitor
Public Function TestaTitulo(qqNum As String) As Boolean
'Testa Titulo de Eleitor - retorna True ou False
'Autor: Carlos Moura - www.geocities.com/espaco_access
Dim strDigVer As String, PriDig As String
Dim strDig As String, SecDig As String
strDigVer = Right(qqNum, 2)
PriDig = Base_11(Left(qqNum, Len(qqNum) - 4))
SecDig = Base_11(Mid(Right(qqNum, 4), 1, 3))
strDig = PriDig & SecDig
If strDigVer <> strDig Then
TestaTitulo = False
Else
TestaTitulo = True
End If
End Function
Private Function Base_11(QNumero As String) As Integer
Dim Numero As String, i As Integer, Produto As Integer
Dim Multiplicador As Integer, Digito As Integer
Numero = Trim$(QNumero)
' Calcula digito do modulo 11
Multiplicador = 2
For i = Len(Numero) To 1 Step -1
Produto = Produto + Val(Mid(Numero, i, 1)) * Multiplicador
Multiplicador = IIf(Multiplicador = 9, 2, Multiplicador + 1)
Next
' Exceção
Digito = 11 - Int(Produto Mod 11)
Digito = IIf(Digito = 10 Or Digito = 11, 0, Digito)
Base_11 = Trim$(Digito)
End Function

Quero o usandoaccess cada vez mais completo...

Forte abraço!

Rubens Cusnir   18/03/2015 12:49:47

Agradeço a explicação, usei a rotina do CPF e deu certo.

Abraços,

Rubens Cusnir

Marcio Morvan da Silva Jr   09/11/2015 15:45:43

Boa tarde pessoal.
Fiz este teste de Verificador de CPF e deu certo.
Só que tem um porém. Quando você coloca algum CPF que não é correto, dai vem a Msgbox dizendo que está errado. Quando você apaga e deixa o campo zerado (Null) ele dá erro e precisa depurar.
Existe algum comando para que este erro seja anulado quando o campo estiver Null?
Obrigado!

Robson Oliveira dos Santos   21/06/2016 17:17:40

Avelino, boa tarde!
Acompanho suas aulas ja ha algum tempo e me apareceu uma duvido em um projeto.
Utilizo o verificador de CPF/CNPJ com sucesso, mas esbarrei em uma outra verificação necessária: a do Titulo de Eleitor!
Um companheiro, em um comentário acima, dispôs um código, no entanto não parece estar funcionando a contento.
Poderia comentar se testou e disponibilizar mais detalhes.
Obs.: peço por esse canal, por que nao tenho acesso ao contato do citado comentador (Marcio Melo).
Grato

Avelino sampaio   22/06/2016 05:10:08

Robson,

se inscreva no nosso fórum e abra um tópico sobre este assunto. Lá poderei te ajudar de forma mais efetiva.

http://www.redeaccess.com.br

Te aguardo

Robson Oliveira dos Santos   22/06/2016 16:44:06

Já cadastrado e criado topico em 'Off'. Caso tenha criado em local inadequado, por favor, faça a devida correção.

Wenderson Fernandes   26/02/2017 11:01:52

Boa tarde, estou fazendo testes com o validador de cpf e me deparei com um problema, cpf's que iniciam com zero ele retorna falso, como resolver, sou um pouco leigo no assunto.

Avelino Sampaio   26/02/2017 11:29:47

Wenderson,

Esta realizando o teste com o meu exemplo ou no seu aplicativo ?

Experimente com este cpf e me diga se funcionou:

076.853.978-11

No agurdo


William Pereira   20/03/2017 12:05:40

Olá,
Sou aprendiz inexperiente no ACCESS mas olhando videos aulas no you tube eu consegui criar um sisteminha de inventário. Eu gostaria de colocar essas validações de CPF e CNPF no meu aplicativo. Como fazer? Tenho que copiar esses códigos para dentro de um módulo ou no próprio campo? Onde fica esse evento de campo que tem que inserir o código final? Agradeço qualquer ajuda.

William Pereira   20/03/2017 13:06:45

Eu de novo! Eu copiei os códigos para CPF e CNPJ, colocando cada um dentro de um módulo. Depois nos campos respectivos de CPF e CNPJ, nos seus respectivos formulários, eu copiei os códigos recomendados para Antes de Atualizar. Não funcionou. Fica dando a seguinte mensagem:

O Microsoft Access não pode localizar o objeto 'Private Sub CPF_BeforeUpdate(cancel As Integer)
If fncCpfValido(Me!CPF) = False Then
MsgBox "CPF inválido".

Onde está o erro?
Eu salvei os módulos com os nomes de Valida CPF e Valida CNPJ. O erro está aqui? Devo salvar com que nomes?
Agradeço a ajuda!


Envie seu comentário: