Gerar CPF em Excel VBA: Função com Testes
Nem sempre é prático usar o gerador de CPF válido online para copiar números um a um — especialmente quando você precisa preencher centenas de linhas numa planilha. As funções VBA abaixo implementam o algoritmo de módulo 11 direto no Excel, usáveis como fórmula de planilha ou dentro de macros.
Código
Function lfGeraCPF() As String
Dim digits(0 To 10) As Integer
Dim soma As Long
Dim resto As Long
Dim i As Integer
Dim resultado As String
Randomize
' Gera 9 dígitos aleatórios
For i = 0 To 8
digits(i) = Int(Rnd * 10)
Next i
' Primeiro dígito verificador
soma = 0
For i = 0 To 8
soma = soma + digits(i) * (10 - i)
Next i
resto = soma Mod 11
If resto < 2 Then
digits(9) = 0
Else
digits(9) = 11 - resto
End If
' Segundo dígito verificador
soma = 0
For i = 0 To 9
soma = soma + digits(i) * (11 - i)
Next i
resto = soma Mod 11
If resto < 2 Then
digits(10) = 0
Else
digits(10) = 11 - resto
End If
' Monta a string do CPF
resultado = ""
For i = 0 To 10
resultado = resultado & CStr(digits(i))
Next i
lfGeraCPF = resultado
End Function
Function lfValidaCPF(cpf As String) As Boolean
Dim limpo As String
Dim digits(0 To 10) As Integer
Dim soma As Long
Dim resto As Long
Dim esperado As Integer
Dim i As Integer
Dim c As String
Dim todosIguais As Boolean
' Remove caracteres não numéricos
limpo = ""
For i = 1 To Len(cpf)
c = Mid(cpf, i, 1)
If c >= "0" And c <= "9" Then
limpo = limpo & c
End If
Next i
' Verifica comprimento
If Len(limpo) <> 11 Then
lfValidaCPF = False
Exit Function
End If
' Extrai dígitos
For i = 0 To 10
digits(i) = CInt(Mid(limpo, i + 1, 1))
Next i
' Rejeita CPFs com todos os dígitos iguais
todosIguais = True
For i = 1 To 10
If digits(i) <> digits(0) Then
todosIguais = False
Exit For
End If
Next i
If todosIguais Then
lfValidaCPF = False
Exit Function
End If
' Verifica primeiro dígito verificador
soma = 0
For i = 0 To 8
soma = soma + digits(i) * (10 - i)
Next i
resto = soma Mod 11
If resto < 2 Then
esperado = 0
Else
esperado = 11 - resto
End If
If digits(9) <> esperado Then
lfValidaCPF = False
Exit Function
End If
' Verifica segundo dígito verificador
soma = 0
For i = 0 To 9
soma = soma + digits(i) * (11 - i)
Next i
resto = soma Mod 11
If resto < 2 Then
esperado = 0
Else
esperado = 11 - resto
End If
If digits(10) <> esperado Then
lfValidaCPF = False
Exit Function
End If
lfValidaCPF = True
End FunctionAnálise do código
A função lfGeraCPF começa chamando Randomize para inicializar o gerador de números aleatórios do VBA com base no relógio do sistema, evitando sequências repetidas entre execuções. Em seguida, um loop de 0 a 8 preenche o array digits com nove dígitos aleatórios gerados por Int(Rnd * 10), que produz inteiros de 0 a 9.
O cálculo dos dígitos verificadores segue o algoritmo módulo 11. Para o primeiro dígito, cada dígito base é multiplicado por pesos decrescentes de 10 a 2, a soma passa pelo operador Mod 11 e o resultado determina o dígito: se o resto for menor que 2, o dígito é 0; caso contrário, subtrai-se o resto de 11. O segundo dígito repete o processo incluindo o primeiro verificador, com pesos de 11 a 2. Ambos os resultados são armazenados nas posições 9 e 10 do array.
A função lfValidaCPF percorre a string caractere a caractere com Mid() para remover formatação, verifica se restam exatamente 11 dígitos, rejeita CPFs com todos os dígitos iguais e recalcula os dois dígitos verificadores com Mod 11 para comparar com os informados. A construção final do CPF usa CStr() para converter cada inteiro do array em caractere, concatenando tudo em uma string de 11 dígitos.
Uso
Como fórmula de planilha, basta digitar em qualquer célula:
=lfGeraCPF()Cada vez que a planilha recalcular, um novo CPF será gerado. Para usar dentro de uma macro VBA:
Sub ExemploCPF()
Dim novoCpf As String
novoCpf = lfGeraCPF()
Debug.Print "CPF gerado: " & novoCpf
Debug.Print "Válido: " & lfValidaCPF(novoCpf)
End SubTestes
Sub TestGeraCPF()
Dim cpf As String
Dim i As Integer
Dim cpf1 As String
Dim cpf2 As String
Dim cpf3 As String
Dim algumDiferente As Boolean
' Teste 1: Verifica se o CPF tem 11 dígitos
cpf = lfGeraCPF()
If Len(cpf) = 11 Then
Debug.Print "PASSOU - Teste 1: CPF tem 11 dígitos (" & cpf & ")"
Else
Debug.Print "FALHOU - Teste 1: esperava 11 dígitos, obteve " & Len(cpf)
End If
' Teste 2: Verifica se o CPF gerado é válido
Dim todosValidos As Boolean
todosValidos = True
For i = 1 To 100
cpf = lfGeraCPF()
If Not lfValidaCPF(cpf) Then
Debug.Print "FALHOU - Teste 2: CPF inválido gerado: " & cpf
todosValidos = False
Exit For
End If
Next i
If todosValidos Then
Debug.Print "PASSOU - Teste 2: 100 CPFs gerados são válidos"
End If
' Teste 3: Verifica se gera CPFs diferentes
cpf1 = lfGeraCPF()
cpf2 = lfGeraCPF()
cpf3 = lfGeraCPF()
algumDiferente = (cpf1 <> cpf2) Or (cpf2 <> cpf3)
If algumDiferente Then
Debug.Print "PASSOU - Teste 3: CPFs diferentes (" & cpf1 & ", " & cpf2 & ", " & cpf3 & ")"
Else
Debug.Print "FALHOU - Teste 3: três CPFs iguais gerados"
End If
End SubPara executar os testes, abra o Editor VBA (Alt+F11), cole todo o código em um módulo e execute a Sub TestGeraCPF com F5. Os resultados aparecem na janela Imediato (Ctrl+G).
Para validar CPFs existentes no Excel, consulte o guia completo de validação em Excel VBA. Para gerar CPFs rapidamente sem código, use o gerador online.