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.
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 12
Título Eleitoral 1 0 6 6 4 4 4 4 0 3 0 2
Multiplicar por 2 3 4 5 6 7 8 9
Resultado a somar 2 + 0 + 24 + 30 + 24 + 28 + 32 + 36 + =176

Obtendo 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 12
Título Eleitoral 1 0 6 6 4 4 4 4 0 3 0 2
Multiplicar por 7 8 9
Resultado a somar 0 + 24 0 =24

Obtendo 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ódigo
SP 01 PI 15
MG 02 RN 16
RJ 03 AL 17
RS 04 MT 18
BA 05 MS 19
PR 06 DF 20
CE 07 SE 21
PE 08 AM 22
SC 09 RS 23
GO 10 AC 24
MA 11 AP 25
PB 12 RR 26
PA 13 TO 27
ES 14 ZZ-Exterior 28

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

Public Function VerificarTituloEleitor(sTitulo 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 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(sTitulo) < 12 Then
    sTitulo = String(12 - Len(sTitulo), "0") & sTitulo
End If
'Pega a posição do último dígito
UltDig = Len(sTitulo)
'Sai da função caso a célula esteja vazia
If sTitulo = "000000000000" Then
    VerificarTituloEleitor = ""
    Exit Function
End If
'Pega cada dígito do CPF informado e
'coloca nas variáveis específicas
d1 = CInt(Mid(sTitulo, UltDig - 11, 1))
d2 = CInt(Mid(sTitulo, UltDig - 10, 1))
d3 = CInt(Mid(sTitulo, UltDig - 9, 1))
d4 = CInt(Mid(sTitulo, UltDig - 8, 1))
d5 = CInt(Mid(sTitulo, UltDig - 7, 1))
d6 = CInt(Mid(sTitulo, UltDig - 6, 1))
d7 = CInt(Mid(sTitulo, UltDig - 5, 1))
d8 = CInt(Mid(sTitulo, UltDig - 4, 1))
d9 = CInt(Mid(sTitulo, UltDig - 3, 1))
d10 = CInt(Mid(sTitulo, UltDig - 2, 1))
d11 = CInt(Mid(sTitulo, UltDig - 1, 1))  '<----- Aqui são os DVs informados
d12 = CInt(Mid(sTitulo, UltDig, 1))    '<----- no Títlo Eleitoral analizado
'----------- Aqui é executado o calculo para obter os digitos verificadores corretos
DV1 = (d1 * 2) + (d2 * 3) + (d3 * 4) + (d4 * 5) + (d5 * 6) + (d6 * 7) + (d7 * 8) + (d8 * 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 = (d9 * 7) + (d10 * 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 d11 = DV1 And d12 = DV2 Then
    If CInt(d9 & d10) > 0 And CInt(d9 & d10) < 29 Then
        VerificarTituloEleitor = "Título Eleitoral Válido"
    Else
        VerificarTituloEleitor = "Título Eleitoral Inválido"
    End If
Else
    VerificarTituloEleitor = "Título Eleitoral Inválido"
End If
End Function

Retorne à 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á 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

9 Responses

Leave a Comment