Validar CPF, CNPJ e Título de Eleitor (Parte I)Escrito por: Reinaldo Coral
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 11CPF 5 5 5 2 2 2 3 3 3 0 3Multiplicar por 1 2 3 4 5 6 7 8 9Resultado a somar 5 + 10 + 15 + 8 + 10 + 12 + 21 + 24 + 27 =132Obtendo 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 11CPF 5 5 5 2 2 2 3 3 3 0 3Multiplicar por 0 1 2 3 4 5 6 7 8 9Resultado a somar 0 + 5 + 10 + 6 + 8 + 10 + 18 + 21 + 24 + 0 =102Obtendo 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.01 Public Function VerificarCPF(sCPF As String) As String
02 Dim d1 As Integer
03 Dim d2 As Integer04 Dim d3 As Integer05 Dim d4 As Integer06 Dim d5 As Integer07 Dim d6 As Integer08 Dim d7 As Integer
09 Dim d8 As Integer10 Dim d9 As Integer11 Dim d10 As Integer12 Dim d11 As Integer13 Dim DV1 As Integer14 Dim DV2 As Integer15 Dim UltDig As Integer
16
17 'Completa com zeros à esquerda caso não esteja com os 11 digitos
18 If Len(sCPF) < 11 Then
19 sCPF = String(11 - Len(sCPF), "0") & sCPF
20 End If
21
22 'Pega a posição do último dígito23 UltDig = Len(sCPF)
24
25 'Sai da função caso a célula esteja vazia
26 If sCPF = "00000000000" Then
27 VerificarCPF = ""
28 Exit Function
29 End If
30
31 'Pega cada dígito do CPF informado e
32 'coloca nas variáveis específicas
33
34 d1 = CInt(Mid(sCPF, UltDig - 10, 1))35 d2 = CInt(Mid(sCPF, UltDig - 9, 1))36 d3 = CInt(Mid(sCPF, UltDig - 8, 1))37 d4 = CInt(Mid(sCPF, UltDig - 7, 1))38 d5 = CInt(Mid(sCPF, UltDig - 6, 1))39 d6 = CInt(Mid(sCPF, UltDig - 5, 1))40 d7 = CInt(Mid(sCPF, UltDig - 4, 1))41 d8 = CInt(Mid(sCPF, UltDig - 3, 1))42 d9 = CInt(Mid(sCPF, UltDig - 2, 1))43 d10 = CInt(Mid(sCPF, UltDig - 1, 1)) '<----- Aqui são os DVs informados
44 d11 = CInt(Mid(sCPF, UltDig, 1)) '<----- no CPF analizado
45
46 '----------- Aqui é executado o calculo para obter os digitos verificadores corretos
47 DV1 = d1 + (d2 * 2) + (d3 * 3) + (d4 * 4) + (d5 * 5) + (d6 * 6) + (d7 * 7) + (d8 * 8) + (d9 * 9)
48 DV1 = DV1 Mod 11 'Obtem o resto
49 'se o resto for igual a 10 altera pra 0
50 If DV1 = 10 Then
51 DV1 = 0
52 End If
53
54 DV2 = d2 + (d3 * 2) + (d4 * 3) + (d5 * 4) + (d6 * 5) + (d7 * 6) + (d8 * 7) + (d9 * 8) + (DV1 * 9)
55 DV2 = DV2 Mod 11 'Obtem o resto
56 'se o resto for igual a 10 altera pra 0
57 If DV2 = 10 Then
58 DV2 = 0
59 End If
60
61 '---------- Fazendo a comparação dos dvs informados -------
62 If d10 = DV1 And d11 = DV2 Then
63 VerificarCPF = "CPF Válido"
64 Else
65 VerificarCPF = "CPF Inválido"
66 End If
67
68 End FunctionRetorne à 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 14CNPJ 4 4 4 5 5 5 6 6 0 0 0 1 8 3Multiplicar por 6 7 8 9 2 3 4 5 6 7 8 9Resultado a somar 24+ 28+ 32+ 45+ 10+ 15+ 24+ 30+ 0+ 0+ 0+ 9 =217Obtendo 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 14CNPJ 4 4 4 5 5 5 6 6 0 0 0 1 8 3Multiplicar por 5 6 7 8 9 2 3 4 5 6 7 8 9Resultado a somar 20+ 24+ 28+ 40+ 45+ 10+ 18+ 24+ 0+ 0+ 0+ 8+ 72 =289Obtendo 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.01 Public Function VerificarCNPJ(sCNPJ As String) As String
02 Dim d1 As Integer
03 Dim d2 As Integer
04 Dim d3 As Integer05 Dim d4 As Integer06 Dim d5 As Integer07 Dim d6 As Integer08 Dim d7 As Integer09 Dim d8 As Integer10 Dim d9 As Integer11 Dim d10 As Integer12 Dim d11 As Integer13 Dim d12 As Integer14 Dim d13 As Integer15 Dim d14 As Integer16 Dim DV1 As Integer
17 Dim DV2 As Integer
18 Dim UltDig As Integer
19
20 'Completa com zeros à esquerda caso não esteja com os 14 digitos
21 If Len(sCNPJ) < 14 Then
22 sCNPJ = String(14 - Len(sCNPJ), "0") & sCNPJ
23 End If
24
25 'Pega a posição do último dígito
26 UltDig = Len(sCNPJ)
27
28 'Sai da função caso a célula esteja vazia
29 If sCNPJ = "00000000000000" Then
30 VerificarCNPJ = ""
31 Exit Function
32 End If
33
34 'Pega cada dígito do CNPJ informado e35 'coloca nas variáveis específicas
36
37 d1 = CInt(Mid(sCNPJ, UltDig - 13, 1))38 d2 = CInt(Mid(sCNPJ, UltDig - 12, 1))39 d3 = CInt(Mid(sCNPJ, UltDig - 11, 1))40 d4 = CInt(Mid(sCNPJ, UltDig - 10, 1))41 d5 = CInt(Mid(sCNPJ, UltDig - 9, 1))42 d6 = CInt(Mid(sCNPJ, UltDig - 8, 1))43 d7 = CInt(Mid(sCNPJ, UltDig - 7, 1))44 d8 = CInt(Mid(sCNPJ, UltDig - 6, 1))
45 d9 = CInt(Mid(sCNPJ, UltDig - 5, 1))
46 d10 = CInt(Mid(sCNPJ, UltDig - 4, 1))47 d11 = CInt(Mid(sCNPJ, UltDig - 3, 1))48 d12 = CInt(Mid(sCNPJ, UltDig - 2, 1))49 d13 = CInt(Mid(sCNPJ, UltDig - 1, 1)) '<----- Aqui são os DVs informados
50 d14 = CInt(Mid(sCNPJ, UltDig, 1)) '<----- no CNPJ analizado
51
52 '----------- Aqui é executado o calculo para obter os digitos verificadores corretos
53 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)
54 DV1 = DV1 Mod 11 'Obtem o resto
55 'se o resto for igual a 10 altera pra 0
56 If DV1 = 10 Then
57 DV1 = 0
58 End If
59
60 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)
61 DV2 = DV2 Mod 11 'Obtem o resto
62 'se o resto for igual a 10 altera pra 0
63 If DV2 = 10 Then
64 DV2 = 0
65 End If
66
67 '---------- Fazendo a comparação dos dvs informados -------
68 If d13 = DV1 And d14 = DV2 Then
69 VerificarCNPJ = "CNPJ Válido"
70 Else
71 VerificarCNPJ = "CNPJ Inválido"
72 End If
73
74 End FunctionRetorne à 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á retornadoNull. 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. Senumber 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á retornadoNull.
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. Sestring 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 Operadorusado 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
Validar CPF, CNPJ e Título de Eleitor (Parte II)Escrito por: Reinaldo Coral
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.O objetivo da função que desenvolveremos é de verificar se um número de título eleitoral digitado é válido. Elaborei esta fórmula para o uso na planilha do excel de forma que execute a 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 Título Eleitoral.Primeiramente vamos entender como se obtém o algorítimo do DV(Dígito Verificador) de um Título Eleitoral.O algorítimo para calcular um Título Eleitoral válido é feito de maneira similar ao do CPF e CNPJ. 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 8 primeiros algarismos, respectivamente, por 2, 3, 4, 5, 6, 7, 8 e 9. Vejamos a ilustração.Posição 1 2 3 4 5 6 7 8 9 10 11 12Título Eleitoral 1 0 6 6 4 4 4 4 0 3 0 2Multiplicar por 2 3 4 5 6 7 8 9Resultado a somar 2 + 0 + 24 + 30 + 24 + 28 + 32 + 36 + =176Obtendo o resto da divisão por 11 ==> 176 / 11 = 16 resto 0.Com isso, conseguimos o primeiro dígito verificador (0). Paraa obtenção do segundo dígito verificador, tomaremos os dois dígitos que correspondem a UF do título. Eles ficam nas posições 9 e 10. Incluiremos o primeiro DV obtido e multiplicaremos por 7, 8 e9, respectivamente. Somaremos o produto e dividiremos por 11, aproveitando apenas o resto da divisão. Veja a tabela.Posição 1 2 3 4 5 6 7 8 9 10 11 12Título Eleitoral 1 0 6 6 4 4 4 4 0 3 0 2Multiplicar por 7 8 9Resultado a somar 0 + 24 0 =24Obtendo o resto da divisão por 11 ==> 24 / 11 = 2 resto 2.Agora, conseguimos o segundo dígito verificador (2). Portanto, o DV para este Título Eleitoral é 02.Quando falei em algarismos que correspondem a UF, me referia a tabela de UFs que são válidas para as posições 9 e 10 do número do título de eleitor. Veja a tabela.UF Código UF CódigoSP 01 PI 15MG 02 RN 16RJ 03 AL 17RS 04 MT 18BA 05 MS 19PR 06 DF 20CE 07 SE 21PE 08 AM 22SC 09 RS 23GO 10 AC 24MA 11 AP 25PB 12 RR 26
PA 13 TO 27ES 14 ZZ-Exterior 28Vamos transferir toda essa matemática agora para a função VBA. No código, desmembraremos o número do título 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 Título Eleitoral analizado.Vá ao ambiente de desenvolvimento do VBA (Alt+F11), insira um novo módulo e digite o código abaixo.01 Public Function VerificarTituloEleitor(sTitulo As String) As String
02 Dim d1 As Integer
03 Dim d2 As Integer04 Dim d3 As Integer05 Dim d4 As Integer06 Dim d5 As Integer07 Dim d6 As Integer08 Dim d7 As Integer09 Dim d8 As Integer10 Dim d9 As Integer11 Dim d10 As Integer12 Dim d11 As Integer13 Dim d12 As Integer14 Dim DV1 As Integer
15 Dim DV2 As Integer
16 Dim UltDig As Integer
17
18 'Completa com zeros à esquerda caso não esteja com os 11 digitos
19 If Len(sTitulo) < 12 Then
20 sTitulo = String(12 - Len(sTitulo), "0") & sTitulo
21 End If
22
23 'Pega a posição do último dígito
24 UltDig = Len(sTitulo)
25
26 'Sai da função caso a célula esteja vazia
27 If sTitulo = "000000000000" Then28 VerificarTituloEleitor = ""
29 Exit Function
30 End If
31
32 'Pega cada dígito do CPF informado e33 'coloca nas variáveis específicas
34
35 d1 = CInt(Mid(sTitulo, UltDig - 11, 1))36 d2 = CInt(Mid(sTitulo, UltDig - 10, 1))37 d3 = CInt(Mid(sTitulo, UltDig - 9, 1))38 d4 = CInt(Mid(sTitulo, UltDig - 8, 1))39 d5 = CInt(Mid(sTitulo, UltDig - 7, 1))40 d6 = CInt(Mid(sTitulo, UltDig - 6, 1))
41 d7 = CInt(Mid(sTitulo, UltDig - 5, 1))42 d8 = CInt(Mid(sTitulo, UltDig - 4, 1))
43 d9 = CInt(Mid(sTitulo, UltDig - 3, 1))
44 d10 = CInt(Mid(sTitulo, UltDig - 2, 1))45 d11 = CInt(Mid(sTitulo, UltDig - 1, 1)) '<----- Aqui são os DVs informados46 d12 = CInt(Mid(sTitulo, UltDig, 1)) '<----- no Títlo Eleitoral analizado
47
48 '----------- Aqui é executado o calculo para obter os digitos verificadores corretos
49 DV1 = (d1 * 2) + (d2 * 3) + (d3 * 4) + (d4 * 5) + (d5 * 6) + (d6 * 7) + (d7 * 8) + (d8 * 9)
50 DV1 = DV1 Mod 11 'Obtem o resto
51 'se o resto for igual a 10 altera pra 0
52 If DV1 = 10 Then
53 DV1 = 0
54 End If
55
56 DV2 = (d9 * 7) + (d10 * 8) + (DV1 * 9)
57 DV2 = DV2 Mod 11 'Obtem o resto
58 'se o resto for igual a 10 altera pra 0
59 If DV2 = 10 Then
60 DV2 = 0
61 End If
62
63 '---------- Fazendo a comparação dos dvs informados -------
64 If d11 = DV1 And d12 = DV2 Then
65 If CInt(d9 & d10) > 0 And CInt(d9 & d10) < 29 Then
66 VerificarTituloEleitor = "Título Eleitoral Válido"
67 Else
68 VerificarTituloEleitor = "Título Eleitoral Inválido"
69 End If
70 Else
71 VerificarTituloEleitor = "Título Eleitoral Inválido"
72 End If
73
74 End FunctionRetorne à planilha e para chamar a função na célula, digite:=VerificarTituloEleitor(A1)Supondo que na célula A1 contenha um número de Título Eleitoral.Bom! Finalizamos mais um artigo. Espero ajudar bastante seus trabalhos. Gostaria de lembrar a você que eu desenvolvo funções personalizadas por encomenda. Caso necessite de um projeto bem elaborado e funcional, solicitem um orçamento . Um abraço.Faça o Download do Arquivo Fonte no final deste artigo.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á retornadoNull. 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. Senumber 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á retornadoNull.
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. Sestring 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 Operadorusado 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