Criando funções em VBa

Função validar Cpf

**Só uma pequena observação, quando utilizar esta função insira também os pontos**

Como calcular o DV do CPF
Para entender o algoritmo de cálculo do CPF vamos utilizar um exemplo prático.
Considere o seguinte CPF (sem o DV): 333.444.555
Posição 1 2 3 4 5 6 7 8 9
Número 3 3 3 4 4 4 5 5 5
Começamos a multiplicar os dígitos do CPF, a partir da posição 9, ou seja, de trás para frente, por 2, 3, 4, 5 e assim por diante, conforme indicado na tabela a seguir:
Posição 1 2 3 4 5 6 7 8 9
Número 3 3 3 4 4 4 5 5 5
Multiplica por: 10 9 8 7 6 5 4 3 2
Resultado 30 27 24 28 24 20 20 15 10
Somo os resultados obtidos na quarta linha da tabela anterior:
Soma1 = 30+27+24+28+24+20+20+15+10
Soma1 = 198
Faço a divisão desta soma por 11 e determino o resto da divisão:
198/11 Resulta em uma divisão exata, com resto 0
Regra : Quando o resto é zero ou um , o DV é 0.
Quando o resto é diferente de zero ou um , o DV é obtido fazendo-se: 11-resto
Neste caso como o resto foi zero, o primeiro DV é zero:
DV1=0
O DV1 calculado passa a fazer parte do CPF, conforme indicado pela tabela a seguir:
Posição 1 2 3 4 5 6 7 8 9 10
Número 3 3 3 4 4 4 5 5 5 0
Agora repetimos o processo anterior, porém já considerando o DV1 como parte integrante do CPF, conforme indicado pela tabela a seguir:
Posição 1 2 3 4 5 6 7 8 9 10
Número 3 3 3 4 4 4 5 5 5 0
Multiplica por: 11 10 9 8 7 6 5 4 3 2
Resultado 33 30 27 32 28 24 25 20 15 0
Somo os resultados obtidos na quarta linha da tabela anterior:
Soma2 = 33+30+27+32+28+24+25+20+15+0
Soma1 = 234
Faço a divisão desta soma por 11 e determino o resto da divisão:
234/11 Resulta em (21), com resto 3
Regra : Quando o resto é zero ou um , o DV é 0.
Quando o resto é diferente de zero ou um , o DV é obtido fazendo-se: 11-resto
Neste caso como o resto foi 3, o segundo DV é :
DV2 = 11 - 3
DV2 = 8
Com isso o CPF, já com os dois DVs fica conforme indicado na tabela a seguir:
Posição 1 2 3 4 5 6 7 8 9 10 11
Número 3 3 3 4 4 4 5 5 5 0 8
Ou seja: 333.444.555 - 08
Os algoritmos para cálculo dos DVs do CNPJ são praticamente iguais. A única diferença é a quantidade de dígitos do CNPJ é diferente do CPF.


Comentário

Agora que entendemos como funciona o calculo para o DV do CPF, vamos a função que poderá ser facilmente incluída em seus projetos de Excel.


Abra o Excel - insira um módulo e copie e cole o código abaixo, você também pode salvar como suplemento do Excel e utiliza-lo sempre.

Public Function ValidaCPF(CPF As String) As String

'Função para cálculo do dígito verificador do CPF

'Iniciamos a função com a declaração das variáveis que serão utilizadas.

' As variáveis d1 até d11, conterão os dígitos individuais
' do CPF. Por exemplo, ao digitar o CPF: 123.456.789-11, essas
' variáveis conterão os seguintes valores:
' d1=1 d2=2 d3=3 d4=4 d5=5 d6=5 d7=7 d8=8 d9=9 d10=1 d11=1

Dim d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11 As Integer

' Demais variáveis que serão utilizadas para o cálculo do DV.

Dim Soma1, Soma2, Resto As Integer
Dim Resto1, Resto2 As Integer
Dim DV1, DV2 As Integer

' Em primeiro lugar testo se a célula com o CPF contém um valor
' válido, isto é, um valor Não Nulo.

If Not (IsNull(CPF)) Then

'*************************************************************************
' Os comandos a seguir desmembram o CPF um a um , atribuindo os valores *
' de d1 ... d11 , usando as funções Mid$ e Val *
' Como o CPF está no formato de Texto, vamos extrair os dígitos do CPF *
' um a um, converter o respectivo valor de texto para número e atribuir *
' esse valor para as variáveis d1 até d11. *
'*************************************************************************

d1 = Val(Mid$(CPF, 1, 1))
d2 = Val(Mid$(CPF, 2, 1))
d3 = Val(Mid$(CPF, 3, 1))
d4 = Val(Mid$(CPF, 5, 1))
d5 = Val(Mid$(CPF, 6, 1))
d6 = Val(Mid$(CPF, 7, 1))
d7 = Val(Mid$(CPF, 9, 1))
d8 = Val(Mid$(CPF, 10, 1))
d9 = Val(Mid$(CPF, 11, 1))
d10 = Val(Mid$(CPF, 13, 1))
d11 = Val(Mid$(CPF, 14, 1))

'*************************************************************************
' A partir de agora passo a utilizar os valores anteriores para cálculo *
' do dígito verificador do CPF *
'*************************************************************************

' Cálculo do primeiro DV

Soma1 = ((d1 * 10) + (d2 * 9) + (d3 * 8) + (d4 * 7) + (d5 * 6) + (d6 * 5) + (d7 * 4) + (d8 * 3) + (d9 * 2))
Resto1 = (Soma1 Mod 11)

If (Resto1 <= 1) Then DV1 = 0 Else DV1 = 11 - Resto1 End If ' Agora inicio o cálculo do segundo DV, já incorporando ' o segundo DV como parte do CPF, para o cálculo. Soma2 = (d1 * 11) + (d2 * 10) + (d3 * 9) + (d4 * 8) + (d5 * 7) + (d6 * 6) + (d7 * 5) + (d8 * 4) + (d9 * 3) + (DV1 * 2) Resto2 = (Soma2 Mod 11) If (Resto2 <= 1) Then DV2 = 0 Else DV2 = 11 - Resto2 End If ' Agora faço o teste para saber se os DVs calculados (DV1 e DV2) ' conferem com os DVs do CPF - d10 e d11 If ((DV1 <> d10) Or (DV2 <> d11)) Then

' Atribuo a palavra "Inválido" para uma variável com o mesmo
' nome da função - ValidaCPF.
' Essa é a maneira de fazer com que a função retorne um valor,
' ou seja, atribuindo o valor a ser retornado, à uma variável
' com o mesmo nome da função.
ValidaCPF = "Inválido"

Else

' Atribuo a palavra "Válido" para uma variável com o mesmo
' nome da função - ValidaCPF.
' Essa é a maneira de fazer com que a função retorne um valor,
' ou seja, atribuindo o valor a ser retornado, à uma variável
' com o mesmo nome da função.
ValidaCPF = "Válido"

End If

End If

End Function

6 comentários:

Fernando disse...

Estranho.. todos os cpf's que eu testei retornaram inválidos.. está certo esse código?

Unknown disse...

Muito bom, me ajudou muito, thanks a lot!!!

M4R10 disse...

Parabéns pelo grande conhecimento no assunto...
no mais tenho uma duvida, como faço pra executar esse calculo do cpf, copiei tudo mas quando clico em Alt+f8 essa macro nao ta na lista..
m4r100@bol.com.br agradeço a atencão...

PS: consegui fazer uma formula que calcula os digitos mas queria mesmo era a macro

Anônimo disse...

O Excel ta acusando erro de sintaxe nesse ponto:

If (Resto1 <= 1) Then DV1 = 0 Else DV1 = 11 - Resto1 End If ' Agora inicio o cálculo do segundo DV, já incorporando ' o segundo DV como parte do CPF, para o cálculo. Soma2 = (d1 * 11) + (d2 * 10) + (d3 * 9) + (d4 * 8) + (d5 * 7) + (d6 * 6) + (d7 * 5) + (d8 * 4) + (d9 * 3) + (DV1 * 2) Resto2 = (Soma2 Mod 11) If (Resto2 <= 1) Then DV2 = 0 Else DV2 = 11 - Resto2 End If ' Agora faço o teste para saber se os DVs calculados (DV1 e DV2) ' conferem com os DVs do CPF - d10 e d11 If ((DV1 <> d10) Or (DV2 <> d11)) Then


O que devo fazer?

Anônimo disse...

Legal a função que foi postada aqui, mas como eu uso ela, pois já tentei usar como se fosse uma função (tipo a =procv() ou =soma()), mas o Excel 2003 retorna o erro "#NOME?" que pelo que entendo significa que a função ou esta escrita errada ou não existe. Como uso esta função!?!?!??!

Anônimo disse...

Tem um erro no código: Na parte de atribuir os valores das variáveis d... segue o código correto : d1 = Val(Mid$(CPF, 1, 1))
d2 = Val(Mid$(CPF, 2, 1))
d3 = Val(Mid$(CPF, 3, 1))
d4 = Val(Mid$(CPF, 4, 1))
d5 = Val(Mid$(CPF, 5, 1))
d6 = Val(Mid$(CPF, 6, 1))
d7 = Val(Mid$(CPF, 7, 1))
d8 = Val(Mid$(CPF, 8, 1))
d9 = Val(Mid$(CPF, 9, 1))
d10 = Val(Mid$(CPF, 10, 1))
d11 = Val(Mid$(CPF, 11, 1))

Paulo Andrade (paulo@pauloandrade.adm.br)