Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ento Mos obra!!! 1 Validao de nmero de CPF (Cadastro de Pessoa Fsica). Primeiramente vamos entender como se obtm o algortimo do DV(Dgito Verificador) de um CPF. O algortimo para calcular um CPF vlido feito em duas etapas. Primeiro conseguimos o valor para o primeiro digito verificador. Ele obtido atravs do resto da diviso por 11 da soma da multiplicao de cada um dos 9 primeiros algarismos, respectivamente, por 1, 2, 3, 4, 5, 6, 7, 8 e 9. Complicado? Vejamos a ilustrao.
1 5 1 5+
2 5 2 10 +
3 5 3 15 +
4 2 4 8+
5 2 5 10 +
6 2 6 12 +
7 3 7 21 +
8 3 8 24 +
9 10 11 3 0 3 9 27 =132
Obtendo o resto da diviso por 11 ==> 132 / 11 = 12 resto 0. Com isso, conseguimos o primeiro dgito verificador (0). Para o segundo dgito verificador, o procedimento bem parecido, s acrescentamos ao somatrio a multiplicao pelo primeiro dgito obtido anteriormente. Ficar assim:
1 5 0 0+
2 5 1 5+
3 5 2 10 +
4 2 3 6+
5 2 4 8+
6 2 5 10 +
7 3 6 18 +
8 3 7 21 +
9 3 8 24 +
10 11 0 3 9 0 =102
Obtendo o resto da diviso por 11 ==> 102 / 11 = 9 resto 3. Agora, conseguimos o segundo dgito verificador (3). Portanto, o DV para este CPF 03. Bem, eu precisava esclarecer um pouco como funciona o clculo deste algoritimo para que voc pudesse entender como trabalharamos o cdigo. Ento, podemos agora, partir para o seu desenvolvimento. Basicamente, desmembraremos o cpf em algarismos, executaremos as operaes matemticas e, por fim, efetuaremos a comparao dos DVs obtidos com o algortimo com os DVs fornecidos no CPF analizado. V ao ambiente de desenvolvimento do VBA (Alt+F11), insira um novo mdulo e digite o cdigo abaixo.
01 Public Function VerificarCPF(sCPF As String) As String 02 Dim d1 As Integer 03 Dim d2 As Integer 04 Dim d3 As Integer 05 Dim d4 As Integer 06 Dim d5 As Integer 07 Dim d6 As Integer 08 Dim d7 As Integer
09 Dim d8 As Integer 10 Dim d9 As Integer 11 Dim d10 As Integer 12 Dim d11 As Integer 13 Dim DV1 As Integer 14 Dim DV2 As Integer 15 Dim UltDig As Integer 16 17 'Completa com zeros esquerda caso no esteja com os 11 digitos 18 If Len(sCPF) < 11 Then 19 21 22 'Pega a posio do ltimo dgito 23 UltDig = Len(sCPF) 24 25 'Sai da funo caso a clula esteja vazia 26 If sCPF = "00000000000" Then 27 28 VerificarCPF = "" Exit Function sCPF = String(11 - Len(sCPF), "0") & sCPF 20 End If
29 End If 30 31 'Pega cada dgito do CPF informado e 32 'coloca nas variveis especficas 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 so 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) 'Obtem o resto
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 comparao dos dvs informados ------62 If d10 = DV1 And d11 = DV2 Then 63 VerificarCPF = "CPF Vlido" 64 Else 65 67 68 End Function VerificarCPF = "CPF Invlido" 66 End If
Retorne planilha e para chamar a funo na clula, digite: =VerificarCPF(A1) Supondo que na clula A1 contenha um nmero de CPF. At que parecia mais difcil n? Mas simples. O chato a matemtica! (risos) 2 - Validao de nmero de CNPJ (Cadastro Nacional de Pessoa Jurdica). No caso do CNPJ, o DV corresponde ao resto da diviso por 11 do somatrio da multiplicao 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 ilustrao para melhor entendimento.
1 4 6 24+
2 4 7 28+
3 4 8 32+
4 5 9 45+
5 5 2 10+
6 5 3 15+
7 6 4 24+
8 6 5 30+
9 0 6 0+
10 0 7 0+
11 0 8 0+
12 13 14 1 8 3 9 9 =217
Obtendo o resto da diviso por 11 ==> 217 / 11 = 19 resto 8. Com isso, conseguimos o primeiro dgito verificador (8). Para o segundo dgito verificador, o procedimento bem parecido, s acrescentamos ao somatrio a multiplicao pelo primeiro dgito obtido anteriormente. Ficar assim:
1 4 5 20+
2 4 6 24+
3 4 7 28+
4 5 8 40+
5 5 9 45+
6 5 2 10+
7 6 3 18+
8 6 4 24+
9 0 5 0+
10 0 6 0+
11 0 7 0+
12 1 8 8+
13 14 8 3 9 72 =289
Obtendo o resto da diviso por 11 ==> 289 / 11 = 26 resto 3. Agora, conseguimos o segundo dgito verificador (3). Portanto, o DV para este CNPJ 83. Vamos desenvolver o cdigo. Seguiremos o mesmo conceito do clculo do CPF. Desmembraremos o CNPJ em algarismos, executaremos as operaes matemticas e, por fim, efetuaremos a comparao dos DVs obtidos com o algortimo com os DVs fornecidos no CNPJ analizado. V ao ambiente de desenvolvimento do VBA (Alt+F11) e digite o cdigo abaixo num Mdulo.
01 Public Function VerificarCNPJ(sCNPJ As String) As String 02 Dim d1 As Integer 03 Dim d2 As Integer 04 Dim d3 As Integer 05 Dim d4 As Integer 06 Dim d5 As Integer 07 Dim d6 As Integer
08 Dim d7 As Integer 09 Dim d8 As Integer 10 Dim d9 As Integer 11 Dim d10 As Integer 12 Dim d11 As Integer 13 Dim d12 As Integer 14 Dim d13 As Integer 15 Dim d14 As Integer 16 Dim DV1 As Integer 17 Dim DV2 As Integer 18 Dim UltDig As Integer 19 20 'Completa com zeros esquerda caso no 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 posio do ltimo dgito 26 UltDig = Len(sCNPJ) 27 28 'Sai da funo caso a clula esteja vazia 29 If sCNPJ = "00000000000000" Then 30 VerificarCNPJ = "" 31 Exit Function 32 End If 33 34 'Pega cada dgito do CNPJ informado e 35 'coloca nas variveis especficas 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 so 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) 'Obtem o resto
55 'se o resto for igual a 10 altera pra 0 56 If DV1 = 10 Then 57 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) DV1 = 0 58 End If
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 comparao dos dvs informados ------68 If d13 = DV1 And d14 = DV2 Then 69 VerificarCNPJ = "CNPJ Vlido" 70 Else 71 73 74 End Function VerificarCNPJ = "CNPJ Invlido" 72 End If
Retorne planilha e para chamar a funo na clula, digite: =VerificarCNPJ(A1) Supondo que na clula A1 contenha um nmero de CNPJ. Bem, resta, agora, a funo de validao de um Ttulo Eleitoral. Para no estender demais este artigo, postarei numa nova oportunidade a segunda parte deste artigo, abordando como validar um ttulo de eleitor. At l. Termos aprendidos neste artigo:
Len
Retorna um Long que contm o nmero de caracteres existentes em uma seqncia de caracteres ou o nmero de bytes necessrios para armazenar uma varivel. Sintaxe Len(string | varname) A sintaxe da funo Len tem as seguintes partes:
Descrio Qualquer expresso de seqncia vlida. Se string contiver Null, ser retornado Null. Qualquer nome de varivel vlido. Se varname contiver Null, ser retornadoNull. Se varname for uma Variant, Len tratar essa variante como uma String e retornar sempre o nmero de caracteres nela contidos.
String
Retorna uma Variant (String) que contm uma seqncia de caracteres repetida com o comprimento especificado. Sintaxe String(number, character) A sintaxe da funo String tem os seguintes argumentos nomeados:
Parte number
retornada. Senumber contiver Null, ser retornado Null. character Obrigatria; Variant. Cdigo de caractere especificando o caractere ou expresso de seqncia cujo primeiro caractere usado para formar a seqncia de caracteres de retorno. Se character contiver Null, ser retornadoNull.
CInt
Mid
CInt(expression) Retorna uma Variant (String) que contm um nmero especificado de caracteres de uma seqncia de caracteres. Sintaxe Mid(string, start[, length]) A sintaxe da funo Mid tem os seguintes argumentos nomeados:
Descrio Obrigatria. Expresso de seqncia da qual so retornados os caracteres. Sestring contiver Null, ser retornado Null. Obrigatria; Long. A posio do caractere em string onde a parte a ser considerada comea. Se start for maior que o nmero de caracteres existentes em string, a funo Mid retornar uma seqncia de caracteres de comprimento zero (""). Opcional; Variant (Long). Nmero de caracteres a ser retornado. Se omitido ou se existirem menos caracteres do que os de length no texto (inclusive o caractere em start), sero retornados todos os caracteres a partir da posio start at o final da seqncia de caracteres.
length
Mod
Operador usado para dividir dois nmeros e retornar somente o resto. Sintaxe result = number1 Mod number2 A sintaxe do operador Mod possui as seguintes partes:
Parte result
number1 Obrigatria; qualquer expresso numrica. number2 Obrigatria; qualquer expresso numrica.
Comentrios O operador de mdulo, ou resto, divide number1 por number2 (arredondando nmeros de ponto flutuante para inteiros) e retorna somente o resto como result. Por exemplo, na expresso a seguir, A (result) igual a 5.
A = 19 Mod 6.7
Ento Mos obra!!! 1 Validao de nmero de Ttulo Eleitoral. Primeiramente vamos entender como se obtm o algortimo do DV(Dgito Verificador) de um Ttulo Eleitoral. O algortimo para calcular um Ttulo Eleitoral vlido feito de maneira similar ao do CPF e CNPJ. Primeiro conseguimos o valor para o primeiro digito verificador. Ele obtido atravs do resto da diviso por 11 da soma da multiplicao de cada um dos 8 primeiros algarismos, respectivamente, por 2, 3, 4, 5, 6, 7, 8 e 9. Vejamos a ilustrao.
1 1 2 2+
2 0 3 0+
3 6 4 24 +
4 6 5 30 +
5 4 6 24 +
6 4 7 28 +
7 4 8 32 +
8 4 9 36 +
9 10 11 12 0 3 0 2 =176
Obtendo o resto da diviso por 11 ==> 176 / 11 = 16 resto 0. Com isso, conseguimos o primeiro dgito verificador (0). Paraa obteno do segundo dgito verificador, tomaremos os dois dgitos que correspondem a UF do ttulo. Eles ficam nas posies 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 diviso. Veja a tabela.
1 1
2 0
3 6
4 6
5 4
6 4
7 4
8 4
9 0 7 0+
10 3 8 24
11 0 9 0
12 2 =24
Obtendo o resto da diviso por 11 ==> 24 / 11 = 2 resto 2. Agora, conseguimos o segundo dgito verificador (2). Portanto, o DV para este Ttulo Eleitoral 02. Quando falei em algarismos que correspondem a UF, me referia a tabela de UFs que so vlidas para as posies 9 e 10 do nmero do ttulo de eleitor. Veja a tabela.
UF SP MG RJ RS BA PR CE PE SC GO
Cdigo 01 02 03 04 05 06 07 08 09 10
UF PI RN AL MT MS DF SE AM RS AC
Cdigo 15 16 17 18 19 20 21 22 23 24
MA PB PA ES
11 12 13 14
AP RR TO ZZ-Exterior
25 26 27 28
Vamos transferir toda essa matemtica agora para a funo VBA. No cdigo, desmembraremos o nmero do ttulo em algarismos, executaremos as operaes matemticas e, por fim, efetuaremos a comparao dos DVs obtidos com o algortimo com os DVs fornecidos no Ttulo Eleitoral analizado. V ao ambiente de desenvolvimento do VBA (Alt+F11), insira um novo mdulo e digite o cdigo abaixo.
01 Public Function VerificarTituloEleitor(sTitulo As String) As String 02 Dim d1 As Integer 03 Dim d2 As Integer 04 Dim d3 As Integer 05 Dim d4 As Integer 06 Dim d5 As Integer 07 Dim d6 As Integer 08 Dim d7 As Integer 09 Dim d8 As Integer 10 Dim d9 As Integer 11 Dim d10 As Integer 12 Dim d11 As Integer 13 Dim d12 As Integer 14 Dim DV1 As Integer 15 Dim DV2 As Integer 16 Dim UltDig As Integer 17 18 'Completa com zeros esquerda caso no 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 posio do ltimo dgito 24 UltDig = Len(sTitulo) 25 26 'Sai da funo caso a clula esteja vazia 27 If sTitulo = "000000000000" Then 28 VerificarTituloEleitor = "" 29 Exit Function 30 End If 31 32 'Pega cada dgito do CPF informado e 33 'coloca nas variveis especficas 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 so os DVs informados 46 d12 = CInt(Mid(sTitulo, UltDig, 1)) '<----- no Ttlo 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) 'Obtem o resto
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 comparao dos dvs informados ------64 If d11 = DV1 And d12 = DV2 Then 65 66 67 68 69 70 Else 71 73 74 End Function VerificarTituloEleitor = "Ttulo Eleitoral Invlido" 72 End If If CInt(d9 & d10) > 0 And CInt(d9 & d10) < 29 Then VerificarTituloEleitor = "Ttulo Eleitoral Vlido" Else VerificarTituloEleitor = "Ttulo Eleitoral Invlido" End If
Retorne planilha e para chamar a funo na clula, digite: =VerificarTituloEleitor(A1) Supondo que na clula A1 contenha um nmero de Ttulo Eleitoral. Bom! Finalizamos mais um artigo. Espero ajudar bastante seus trabalhos. Gostaria de lembrar a voc que eu desenvolvo funes personalizadas por encomenda. Caso necessite de um projeto bem elaborado e funcional, solicitem um oramento . Um abrao. Faa o Download do Arquivo Fonte no final deste artigo. Termos aprendidos neste artigo:
Len
Retorna um Long que contm o nmero de caracteres existentes em uma seqncia de caracteres ou o nmero de bytes necessrios para armazenar uma varivel. Sintaxe Len(string | varname)
Descrio Qualquer expresso de seqncia vlida. Se string contiver Null, ser retornado Null. Qualquer nome de varivel vlido. Se varname contiver Null, ser retornadoNull. Se varname for uma Variant, Len tratar essa variante como uma String e retornar sempre o nmero de caracteres nela contidos.
String
Retorna uma Variant (String) que contm uma seqncia de caracteres repetida com o comprimento especificado. Sintaxe String(number, character) A sintaxe da funo String tem os seguintes argumentos nomeados:
Descrio Obrigatria; Long. Comprimento da seqncia de caracteres retornada. Senumber contiver Null, ser retornado Null. Obrigatria; Variant. Cdigo de caractere especificando o caractere ou expresso de seqncia cujo primeiro caractere usado para formar a seqncia de caracteres de retorno. Se character contiver Null, ser retornadoNull.
CInt
Mid
CInt(expression) Retorna uma Variant (String) que contm um nmero especificado de caracteres de uma seqncia de caracteres. Sintaxe Mid(string, start[, length]) A sintaxe da funo Mid tem os seguintes argumentos nomeados:
Descrio Obrigatria. Expresso de seqncia da qual so retornados os caracteres. Sestring contiver Null, ser retornado Null. Obrigatria; Long. A posio do caractere em string onde a parte a ser considerada comea. Se start for maior que o nmero de caracteres existentes em string, a funo Mid retornar uma seqncia de caracteres de comprimento zero (""). Opcional; Variant (Long). Nmero de caracteres a ser retornado. Se omitido ou se existirem menos caracteres do que os de length no texto (inclusive o caractere em start), sero retornados todos os caracteres a partir da posio start at o final da seqncia de caracteres.
length
Mod
Operador usado para dividir dois nmeros e retornar somente o resto. Sintaxe result = number1 Mod number2 A sintaxe do operador Mod possui as seguintes partes:
Parte result
A = 19 Mod 6.7