Skip to content

Instantly share code, notes, and snippets.

@Maux
Last active April 27, 2018 13:34
Show Gist options
  • Save Maux/d11cd8baff3755ed00ef72fe6a1b4b6c to your computer and use it in GitHub Desktop.
Save Maux/d11cd8baff3755ed00ef72fe6a1b4b6c to your computer and use it in GitHub Desktop.
Validação de CPF em VBA - CPF Validation in VBA
Option Explicit
Public Function fxValidarCPF(ByVal CPF As String) As Boolean
'Declaração de variáveis utilizadas na função de validação
Dim arrDigits(1 To 11) As Byte, digtVer1 As Byte, digtVer2 As Byte, i As Byte
Dim sum1 As Integer, sum2 As Integer
Dim tmp As String
'Retira todos caracteres que não são números do valor passado
For i = 1 To Len(CPF)
If Mid(CPF, i, 1) Like "[0-9]" Then tmp = tmp & Mid(CPF, i, 1)
Next i
'Se houver + de 11 números, termina a função com valor FALSE
If Len(CPF) > 11 Then Exit Function
'Se houver - de 11 números, inser 0 'zeros' a frente do valor até
'completar 11 números
For i = 1 To (11 - Len(CPF))
CPF = "0" & CPF
Next i
'Verifica se o valor passado não é um valor repetido
'como 00000000000, 11111111111, 22222222222, etc...
'Estes valores retornam VERDADEIRO na validação
'mas não existem para a Receita Federal
For i = 0 To 9
If CPF = Application.WorksheetFunction.Rept(i, 11) Then Exit Function
Next i
'Armazena cada numero passado para uma matriz (Array)
For i = LBound(arrDigits) To UBound(arrDigits)
arrDigits(i) = CByte(Mid(CPF, i, 1))
Next i
'Armazena a soma dos números nas variáveis sum1 e sum2
For i = 1 To 10
If i < 10 Then sum1 = sum1 + (arrDigits(i) * i)
If i > 1 Then sum2 = sum2 + (arrDigits(i) * (i - 1))
Next i
'Verifica o MOD dos valores de sum1 e sum2 e adiciona
'o resultado nas variáveis digtVer1 e digtVer2
If sum1 Mod 11 = 10 Then digtVer1 = 0 Else digtVer1 = sum1 Mod 11
If sum2 Mod 11 = 10 Then digtVer2 = 0 Else digtVer2 = sum2 Mod 11
'Verifica se o valor de digtVer1 é igual ao 10º número do CPF
'e se o valor de digtVer2 é igual ao 11º número do CPF
'Caso positivo, a função retorna que o número de CPF passado é VERDADEIRO
'Caso contrário, a função retorna FALSO
If digtVer1 = arrDigits(10) And digtVer2 = arrDigits(11) Then fxValidarCPF = True
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment