O Gerador De CPF O Gerador De CPF

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 Function

Aná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 Sub

Testes

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 Sub

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