Validar CPF, CNPJ e TÃtulo de Eleitor (Parte I)
Ensinarei hoje como verificar a validade de um número de CPF, CNPJ ou TÃtulo de eleitor. Para quem lida diariamente com cadastros de clientes, fornecedores e tudo mais, sabe da importância de uma verficação como esta. Muitas vezes podemos falar e digitar um número importantes destes de maneira errada. A partir daà você já pode imaginar a dor de cabeça que um simples numerozinho desses pode gerar!
Pensando nisso, elaborei para o uso na planilha do excel uma validação desses números. A forma de calcular já é de saber público e facilmente encontrada na internet. O que fiz foi desenvolver uma função de cálculo e análise desse algorÃtimo através do VBA do Excel.
Então… Mãos à obra!!!
1 – Validação de número de CPF (Cadastro de Pessoa FÃsica).
Primeiramente vamos entender como se obtém o algorÃtimo do DV(DÃgito Verificador) de um CPF.
O algorÃtimo para calcular um CPF válido é feito em duas etapas. Primeiro conseguimos o valor para o primeiro digito verificador. Ele é obtido através do resto da divisão por 11 da soma da multiplicação de cada um dos 9 primeiros algarismos, respectivamente, por 1, 2, 3, 4, 5, 6, 7, 8 e 9. Complicado? Vejamos a ilustração.
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| CPF | 5 | 5 | 5 | 2 | 2 | 2 | 3 | 3 | 3 | 0 | 3 |
| Multiplicar por | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
| Resultado a somar | 5 + | 10 + | 15 + | 8 + | 10 + | 12 + | 21 + | 24 + | 27 | =132 | |
Obtendo o resto da divisão por 11 ==> 132 / 11 = 12 resto 0.
Com isso, conseguimos o primeiro dÃgito verificador (0). Para o segundo dÃgito verificador, o procedimento é bem parecido, só acrescentamos ao somatório a multiplicação pelo primeiro dÃgito obtido anteriormente. Ficará assim:
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| CPF | 5 | 5 | 5 | 2 | 2 | 2 | 3 | 3 | 3 | 0 | 3 |
| Multiplicar por | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
| Resultado a somar | 0 + | 5 + | 10 + | 6 + | 8 + | 10 + | 18 + | 21 + | 24 + | 0 | =102 |
Obtendo o resto da divisão por 11 ==> 102 / 11 = 9 resto 3.
Agora, conseguimos o segundo dÃgito verificador (3). Portanto, o DV para este CPF é 03.
Bem, eu precisava esclarecer um pouco como funciona o cálculo deste algoritimo para que você pudesse entender como trabalharÃamos o código. Então, podemos agora, partir para o seu desenvolvimento.
Basicamente, desmembraremos o cpf em algarismos, executaremos as operações matemáticas e, por fim, efetuaremos a comparação dos DVs obtidos com o algorÃtimo com os DVs fornecidos no CPF analizado.
Vá ao ambiente de desenvolvimento do VBA (Alt+F11), insira um novo módulo e digite o código abaixo.
Public Function VerificarCPF(sCPF As String) As String Dim d1 As Integer Dim d2 As Integer Dim d3 As Integer Dim d4 As Integer Dim d5 As Integer Dim d6 As Integer Dim d7 As Integer Dim d8 As Integer Dim d9 As Integer Dim d10 As Integer Dim d11 As Integer Dim DV1 As Integer Dim DV2 As Integer Dim UltDig As Integer 'Completa com zeros à esquerda caso não esteja com os 11 digitos If Len(sCPF) < 11 Then sCPF = String(11 - Len(sCPF), "0") & sCPF End If 'Pega a posição do último dÃgito UltDig = Len(sCPF) 'Sai da função caso a célula esteja vazia If sCPF = "00000000000" Then VerificarCPF = "" Exit Function End If 'Pega cada dÃgito do CPF informado e 'coloca nas variáveis especÃficas d1 = CInt(Mid(sCPF, UltDig - 10, 1)) d2 = CInt(Mid(sCPF, UltDig - 9, 1)) d3 = CInt(Mid(sCPF, UltDig - 8, 1)) d4 = CInt(Mid(sCPF, UltDig - 7, 1)) d5 = CInt(Mid(sCPF, UltDig - 6, 1)) d6 = CInt(Mid(sCPF, UltDig - 5, 1)) d7 = CInt(Mid(sCPF, UltDig - 4, 1)) d8 = CInt(Mid(sCPF, UltDig - 3, 1)) d9 = CInt(Mid(sCPF, UltDig - 2, 1)) d10 = CInt(Mid(sCPF, UltDig - 1, 1)) '<----- Aqui são os DVs informados d11 = CInt(Mid(sCPF, UltDig, 1)) '<----- no CPF analizado '----------- Aqui é executado o calculo para obter os digitos verificadores corretos DV1 = d1 + (d2 * 2) + (d3 * 3) + (d4 * 4) + (d5 * 5) + (d6 * 6) + (d7 * 7) + (d8 * 8) + (d9 * 9) DV1 = DV1 Mod 11 'Obtem o resto 'se o resto for igual a 10 altera pra 0 If DV1 = 10 Then DV1 = 0 End If DV2 = d2 + (d3 * 2) + (d4 * 3) + (d5 * 4) + (d6 * 5) + (d7 * 6) + (d8 * 7) + (d9 * 8) + (DV1 * 9) DV2 = DV2 Mod 11 'Obtem o resto 'se o resto for igual a 10 altera pra 0 If DV2 = 10 Then DV2 = 0 End If '---------- Fazendo a comparação dos dvs informados ------- If d10 = DV1 And d11 = DV2 Then VerificarCPF = "CPF Válido" Else VerificarCPF = "CPF Inválido" End If End Function |
Retorne à planilha e para chamar a função na célula, digite:
=VerificarCPF(A1)
Supondo que na célula A1 contenha um número de CPF.
Até que parecia mais difÃcil né? Mas é simples. O chato é a matemática! (risos)
2 – Validação de número de CNPJ (Cadastro Nacional de Pessoa JurÃdica).
No caso do CNPJ, o DV corresponde ao resto da divisão por 11 do somatório da multiplicação de cada algarismo da base respectivamente por 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6 e 5, a partir da unidade. O resto 10 é considerado 0. Vejamos a ilustração para melhor entendimento.
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| CNPJ | 4 | 4 | 4 | 5 | 5 | 5 | 6 | 6 | 0 | 0 | 0 | 1 | 8 | 3 |
| Multiplicar por | 6 | 7 | 8 | 9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
| Resultado a somar | 24+ | 28+ | 32+ | 45+ | 10+ | 15+ | 24+ | 30+ | 0+ | 0+ | 0+ | 9 | =217 | |
Obtendo o resto da divisão por 11 ==> 217 / 11 = 19 resto 8.
Com isso, conseguimos o primeiro dÃgito verificador (8). Para o segundo dÃgito verificador, o procedimento é bem parecido, só acrescentamos ao somatório a multiplicação pelo primeiro dÃgito obtido anteriormente. Ficará assim:
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| CNPJ | 4 | 4 | 4 | 5 | 5 | 5 | 6 | 6 | 0 | 0 | 0 | 1 | 8 | 3 |
| Multiplicar por | 5 | 6 | 7 | 8 | 9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
| Resultado a somar | 20+ | 24+ | 28+ | 40+ | 45+ | 10+ | 18+ | 24+ | 0+ | 0+ | 0+ | 8+ | 72 | =289 |
Obtendo o resto da divisão por 11 ==> 289 / 11 = 26 resto 3.
Agora, conseguimos o segundo dÃgito verificador (3). Portanto, o DV para este CNPJ é 83.
Vamos desenvolver o código. Seguiremos o mesmo conceito do cálculo do CPF. Desmembraremos o CNPJ em algarismos, executaremos as operações matemáticas e, por fim, efetuaremos a comparação dos DVs obtidos com o algorÃtimo com os DVs fornecidos no CNPJ analizado.
Vá ao ambiente de desenvolvimento do VBA (Alt+F11) e digite o código abaixo num Módulo.
Public Function VerificarCNPJ(sCNPJ As String) As String Dim d1 As Integer Dim d2 As Integer Dim d3 As Integer Dim d4 As Integer Dim d5 As Integer Dim d6 As Integer Dim d7 As Integer Dim d8 As Integer Dim d9 As Integer Dim d10 As Integer Dim d11 As Integer Dim d12 As Integer Dim d13 As Integer Dim d14 As Integer Dim DV1 As Integer Dim DV2 As Integer Dim UltDig As Integer 'Completa com zeros à esquerda caso não esteja com os 14 digitos If Len(sCNPJ) < 14 Then sCNPJ = String(14 - Len(sCNPJ), "0") & sCNPJ End If 'Pega a posição do último dÃgito UltDig = Len(sCNPJ) 'Sai da função caso a célula esteja vazia If sCNPJ = "00000000000000" Then VerificarCNPJ = "" Exit Function End If 'Pega cada dÃgito do CNPJ informado e 'coloca nas variáveis especÃficas d1 = CInt(Mid(sCNPJ, UltDig - 13, 1)) d2 = CInt(Mid(sCNPJ, UltDig - 12, 1)) d3 = CInt(Mid(sCNPJ, UltDig - 11, 1)) d4 = CInt(Mid(sCNPJ, UltDig - 10, 1)) d5 = CInt(Mid(sCNPJ, UltDig - 9, 1)) d6 = CInt(Mid(sCNPJ, UltDig - 8, 1)) d7 = CInt(Mid(sCNPJ, UltDig - 7, 1)) d8 = CInt(Mid(sCNPJ, UltDig - 6, 1)) d9 = CInt(Mid(sCNPJ, UltDig - 5, 1)) d10 = CInt(Mid(sCNPJ, UltDig - 4, 1)) d11 = CInt(Mid(sCNPJ, UltDig - 3, 1)) d12 = CInt(Mid(sCNPJ, UltDig - 2, 1)) d13 = CInt(Mid(sCNPJ, UltDig - 1, 1)) '<----- Aqui são os DVs informados d14 = CInt(Mid(sCNPJ, UltDig, 1)) '<----- no CNPJ analizado '----------- Aqui é executado o calculo para obter os digitos verificadores corretos DV1 = (d1 * 6) + (d2 * 7) + (d3 * 8) + (d4 * 9) + (d5 * 2) + (d6 * 3) + (d7 * 4) + (d8 * 5) + (d9 * 6) + (d10 * 7) + (d11 * 8) + (d12 * 9) DV1 = DV1 Mod 11 'Obtem o resto 'se o resto for igual a 10 altera pra 0 If DV1 = 10 Then DV1 = 0 End If DV2 = (d1 * 5) + (d2 * 6) + (d3 * 7) + (d4 * 8) + (d5 * 9) + (d6 * 2) + (d7 * 3) + (d8 * 4) + (d9 * 5) + (d10 * 6) + (d11 * 7) + (d12 * 8) + (DV1 * 9) DV2 = DV2 Mod 11 'Obtem o resto 'se o resto for igual a 10 altera pra 0 If DV2 = 10 Then DV2 = 0 End If '---------- Fazendo a comparação dos dvs informados ------- If d13 = DV1 And d14 = DV2 Then VerificarCNPJ = "CNPJ Válido" Else VerificarCNPJ = "CNPJ Inválido" End If End Function |
Retorne à planilha e para chamar a função na célula, digite:
=VerificarCNPJ(A1)
Supondo que na célula A1 contenha um número de CNPJ.
Bem, resta, agora, a função de validação de um TÃtulo Eleitoral. Para não estender demais este artigo, postarei numa nova oportunidade a segunda parte deste artigo, abordando como validar um tÃtulo de eleitor. Até lá.
Termos aprendidos neste artigo:
| Len | Retorna um Long que contém o número de caracteres existentes em uma seqüência de caracteres ou o número de bytes necessários para armazenar uma variável.
Sintaxe Len(string | varname) A sintaxe da função Len tem as seguintes partes:
|
||||||||
| String | Retorna uma Variant (String) que contém uma seqüência de caracteres repetida com o comprimento especificado.
Sintaxe String(number, character) A sintaxe da função String tem os seguintes argumentos nomeados:
|
||||||||
| CInt | Converte uma expressão no tipo de dados Integer.
Sintaxe CInt(expression) |
||||||||
| Mid | Retorna uma Variant (String) que contém um número especificado de caracteres de uma seqüência de caracteres.
Sintaxe Mid(string, start[, length]) A sintaxe da função Mid tem os seguintes argumentos nomeados:
|
||||||||
| Mod | Operador usado para dividir dois números e retornar somente o resto. Sintaxe result = number1 Mod number2 A sintaxe do operador Mod possui as seguintes partes:
Comentários O operador de módulo, ou resto, divide number1 por number2 (arredondando números de ponto flutuante para inteiros) e retorna somente o resto como result. Por exemplo, na expressão a seguir, A (result) é igual a 5. A = 19 Mod 6.7 |




4 Comentários
[...] Validar CPF, CNPJ e TÃtulo de Eleitor (Parte II) Continuando o artigo anterior sobre Validação de CPF, CNPJ e TÃtulo de Eleitor, abordarei hoje como verificar a validade de um número de um TÃtulo de eleitor. Para quem não leu a primeira parte do artigo, leia aqui. [...]
Comentário feito em dezembro 19th, 2008 às 2:58
[...] 9 primeiros algarismos, respectivamente, por 1, 2, 3, 4, 5, 6, 7, 8 e 9. … fique por dentro clique aqui. Fonte: [...]
Comentário feito em janeiro 12th, 2009 às 22:34
Gostaria de entender melhor sobre isso, sou ocmerciante e me preocupo com a segurança das minahs vendas
Reply
exceldoseujeito Reply:
agosto 26th, 2009 at 19:58
Esse processo é utilizado para verificar, entre outras finalidades, a autenticidade de um documento.
A fórmula é um pouco complexa porque visa dificultar os possÃveis erros de digitação ou tentativas de fraudes.
Enfim, nesta planilha você pode adaptar para utilizá-la conforme suas necessidades. O principal uso dessa função é para se evitar, como eu disse, que um documento seja digitado de forma errada causando aborrecimentos tardios.
Enfim. “Melhor previnir do que remediar”.
Grande abraço.
Reply
Comentário feito em agosto 26th, 2009 às 19:28
Deixar um comentário