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:

Parte Descrição
String Qualquer expressão de seqüência válida. Se string contiver Null, será retornado Null.
Varname Qualquer nome de variável válido. Se varname contiver Null, será retornado Null. Se varname for uma Variant, Len tratará essa variante como uma String e retornará sempre o número de caracteres nela contidos.
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:

Parte Descrição
number Obrigatória; Long. Comprimento da seqüência de caracteres retornada. Se number contiver Null, será retornado Null.
character Obrigatória; Variant. Código de caractere especificando o caractere ou expressão de seqüência cujo primeiro caractere é usado para formar a seqüência de caracteres de retorno. Se character contiver Null, será retornado Null.
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:

Parte Descrição
string Obrigatória. Expressão de seqüência da qual são retornados os caracteres. Se string contiver Null, será retornado Null.
start Obrigatória; Long. A posição do caractere em string onde a parte a ser considerada começa. Se start for maior que o número de caracteres existentes em string, a função Mid retornará uma seqüência de caracteres de comprimento zero ("").
length Opcional; Variant (Long). Número de caracteres a ser retornado. Se omitido ou se existirem menos caracteres do que os de length no texto (inclusive o caractere em start), serão retornados todos os caracteres a partir da posição start até o final da seqüência de caracteres.
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:

Parte Descrição
result Obrigatória; qualquer variável numérica.
number1 Obrigatória; qualquer expressão numérica.
number2 Obrigatória; qualquer expressão numérica.

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

16 comentários em “Validar CPF, CNPJ e Título de Eleitor (Parte I)”

    • 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.

      Responder
    • Ok.
      A proposta do artigo é mostrar as diversas possibilidades e funcionalidades que podemos desenvolver com o VBA.
      Para tanto, utilizo-me de exemplos práticos para facilitar o entendimento e a aplicação.
      Mas, como disse, existem várias formas de obtermos nossos objetivos. Essa é a grande maestria do desenvolvimento.
      Continue assim.
      Um grande abraço, amigo.

      Responder
  1. Olá,
    Utilizei este tutorial para identificar se o valor do campo é CPF ou CNPJ. O problema é que alguns CPF´s ele retornou como CPNJ! acredito que teria que ter alguma outro tipo de validação para evitar este problema, por exemplo, contar os caracteres. Abraço.

    Responder
    • Márcio,
      A validação descrita neste tutorial corresponde a identificar se um CPF, CNPJ é válido, ou seja, se é verdadeiro ou não.
      Para você distinguir um número informado, ou seja, que tipo de documento ele é, realmente você deverá escrever uma fórmula de comparação pela quantidade de dígitos mesmo.
      Abraço

      Responder
  2. Tem Uma Outra Forma
    Sub ValidaCPF()
    frmCPF.edtCPF.Text = frmCPF.edtCPF.Text.Replace(“.”,””)
    if frmCPF.edtCPF.Text.Length < 9
    Forms.MessageBox.Show("Digite os Nove Primeiros Numeros do CPF")
    frmCPF.edtCPF.SetFocus()
    elseif frmCPF.edtCPF.Text “”
    Dim vPosicao As Integer
    Dim vIndex As Integer = 1
    Dim vResultado As Integer
    Dim vMultiplicacao As Integer = 10
    Dim vSoma As Integer
    Dim vDigito1 As Integer
    Dim vDigito2 As Integer
    Dim vCpf As String
    vCpf = frmCPF.edtCPF.Text
    ‘*******************************************************************************
    while vIndex <= 9
    vPosicao = CInt(vCpf.Copy(vIndex, 1)) 'Retorna String da Posição tal ate posicao tal
    vResultado = vPosicao * vMultiplicacao
    vMultiplicacao = vMultiplicacao – 1
    vSoma = vSoma + vResultado
    vIndex = vIndex + 1
    end while
    vDigito1 = vSoma mod 11
    if vDigito1 < 2
    vDigito1 = 0
    else
    vDigito1 = 11 – vDigito1
    end if
    '*******************************************************************************
    vIndex = 1
    vMultiplicacao = 11
    vSoma = 0
    vPosicao = 0
    vResultado = 0
    vCPF = vCPF + CStr(vDigito1)
    while vIndex <= 10
    vPosicao = CInt(vCpf.Copy(vIndex, 1))
    vResultado = vPosicao * vMultiplicacao
    vMultiplicacao = vMultiplicacao – 1
    vSoma = vSoma + vResultado
    vIndex = vIndex + 1
    end while
    vDigito2 = vSoma mod 11
    if vDigito2 < 2
    vDigito2 = 0
    else
    vDigito2 = 11 – vDigito2
    end if
    frmCPF.edtCPFValido.Text = vCpf.Copy(1, 9) + CStr(vDigito1) + CStr(vDigito2)
    frmcpf.edtcpfValido.Text = frmcpf.edtcpfValido.Text.Insert(".",4) 'Adiciona uma String na posição informada
    frmcpf.edtcpfValido.Text = frmcpf.edtcpfValido.Text.Insert(".",8)
    frmcpf.edtcpfValido.Text = frmcpf.edtcpfValido.Text.Insert("-",12)
    else
    Forms.MessageBox.Show("Digite um CPF")
    frmCPF.edtCPF.SetFocus()
    end if
    End Sub

    Responder
  3. Nos testes que eu fiz está dando um erro. Por exemplo, no seu teste de CNPJ, no cálculo do 1º dígito “Obtendo o resto da divisão por 11 ==> 217 / 11 = 19 resto 8.” O resultado é 19,72727. Como chegar no 8?
    Também tive o mesmo problema para calcular o dígito de uma soma que deu 173. Dividindo por 11, temos 15,7 (15,727273), só que o dígito correto também é 8…

    Responder

Deixe um comentário