Ferramentas gratuitas para desenvolvedores. Nenhum dado real de pessoas é consultado ou armazenado.Como funciona o algoritmo do CPF →
Excel (VBA e LAMBDA)

Validar, gerar e formatar CNPJ em Excel (VBA e LAMBDA)

Funções VBA e uma fórmula LAMBDA para validar, gerar e formatar CNPJ numérico e alfanumérico no Excel, com teste em VBA e consulta à API.

Roberto GuerraPublicado em 05 de outubro de 2026Editar no GitHub

Em planilhas de cadastro, o CNPJ alfanumérico surpreende: fórmulas que usam VALOR em cada dígito passam a dar #VALOR!, e colunas numéricas não guardam letras. Esta página traz funções VBA para usar direto na célula, como =ValidarCNPJ(A2), e uma LAMBDA para quem não pode usar macros. Em ambas, cada caractere vale o código ASCII menos 48: dígitos de 0 a 9, letras de 17 (A) a 42 (Z). Formate a coluna como Texto antes de colar os CNPJs, senão o Excel corta os zeros à esquerda. Os demais impactos estão no guia CNPJ alfanumérico: o que muda no seu sistema.

Validar CNPJ em Excel (numérico e alfanumérico)

No editor do VBA (Alt+F11), insira um módulo, cole o código e salve como .xlsm.

ModuloCNPJ.bas
Option Explicit
Option Compare Binary

Private sorteioIniciado As Boolean

Private Function CalcularDigito(ByVal base As String, pesos As Variant) As Integer
  Dim i As Integer, soma As Long, resto As Integer
  For i = 1 To Len(base)
      soma = soma + (Asc(UCase$(Mid$(base, i, 1))) - 48) * pesos(i - 1)
  Next i
  resto = soma Mod 11
  If resto < 2 Then CalcularDigito = 0 Else CalcularDigito = 11 - resto
End Function

Private Function DigitosCNPJ(ByVal base As String) As String
  Dim dv1 As Integer, dv2 As Integer
  dv1 = CalcularDigito(base, Array(5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2))
  dv2 = CalcularDigito(base & dv1, Array(6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2))
  DigitosCNPJ = CStr(dv1) & CStr(dv2)
End Function

Public Function ValidarCNPJ(s As String) As Boolean
  Dim i As Integer, c As String, cnpj As String, base As String
  For i = 1 To Len(s)
      c = UCase$(Mid$(s, i, 1))
      If c Like "[A-Z0-9]" Then
          cnpj = cnpj & c
      ElseIf InStr("./- ", c) = 0 Then
          Exit Function
      End If
  Next i
  If Len(cnpj) <> 14 Then Exit Function
  If Not (Right$(cnpj, 2) Like "##") Then Exit Function
  base = Left$(cnpj, 12)
  If base = String$(12, Left$(base, 1)) Then Exit Function
  ValidarCNPJ = (Right$(cnpj, 2) = DigitosCNPJ(base))
End Function

Pontos de atenção:

  • Strings no VBA começam em 1. Mid$(s, i, 1) lê o caractere da posição i, e o laço vai de 1 a Len(s).
  • Array(...) começa em 0 (sem Option Base 1 no módulo), por isso o peso é lido em pesos(i - 1).
  • Option Compare Binary faz Like "[A-Z0-9]" recusar letras acentuadas.
  • Exit Function devolve False, o valor padrão de um Boolean; símbolos fora de ponto, barra, hífen e espaço encerram a validação.
  • String$(12, ...) recusa bases repetidas como 00.000.000/0000-00, que fecham a conta, mas não são válidas.

Com 11.222.333/0001-81, as somas são 102 e 120, os restos 3 e 10, e os dígitos 8 e 1. Com 12.ABC.345/01DE-35, as somas são 459 e 424, os restos 8 e 6, e os dígitos 3 e 5.

No Excel 365, sem macros, a mesma regra cabe em uma LAMBDA. Em Fórmulas > Gerenciador de Nomes, crie o nome CNPJVALIDO com a fórmula abaixo e use =CNPJVALIDO(A2). Os pesos saem de 2 + MOD(n - posição; 8), que reproduz 5, 4, 3, 2, 9 … 2 e 6, 5, 4, 3, 2, 9 … 2.

CNPJVALIDO (Gerenciador de Nomes)
=LAMBDA(cnpj; LET(
limpo; MAIÚSCULA(SUBSTITUIR(SUBSTITUIR(SUBSTITUIR(SUBSTITUIR(cnpj; "."; ""); "/"; ""); "-"; ""); " "; ""));
SE(NÚM.CARACT(limpo) <> 14; FALSO; LET(
  pos; SEQUÊNCIA(12);
  vals; CÓDIGO(EXT.TEXTO(limpo; pos; 1)) - 48;
  soma1; SOMARPRODUTO(vals * (2 + MOD(12 - pos; 8)));
  digito1; SE(MOD(soma1; 11) < 2; 0; 11 - MOD(soma1; 11));
  soma2; SOMARPRODUTO(vals * (2 + MOD(13 - pos; 8))) + digito1 * 2;
  digito2; SE(MOD(soma2; 11) < 2; 0; 11 - MOD(soma2; 11));
  E(
    SOMARPRODUTO((vals >= 0) * (vals <= 9) + (vals >= 17) * (vals <= 42)) = 12;
    ESQUERDA(limpo; 12) <> REPT(ESQUERDA(limpo; 1); 12);
    DIREITA(limpo; 2) = digito1 & digito2
  )
))
))

Os nomes das funções estão em português, com ; como separador. No Excel em inglês, use os equivalentes (UPPER, SEQUENCE, SUMPRODUCT etc.) e , como separador.

Gerar CNPJ válido em Excel

ModuloCNPJ.bas
Public Function GerarCNPJ(Optional alfanumerico As Boolean = False, Optional formatado As Boolean = False) As String
  Const ALFABETO As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Dim i As Integer, tamanho As Integer, base As String, cnpj As String
  If Not sorteioIniciado Then
      Randomize
      sorteioIniciado = True
  End If
  tamanho = IIf(alfanumerico, 36, 10)
  Do
      base = ""
      For i = 1 To 12
          base = base & Mid$(ALFABETO, Int(Rnd * tamanho) + 1, 1)
      Next i
  Loop While base = String$(12, Left$(base, 1))
  cnpj = base & DigitosCNPJ(base)
  If formatado Then cnpj = FormatarCNPJ(cnpj)
  GerarCNPJ = cnpj
End Function

A variável sorteioIniciado, declarada no topo do módulo, garante que Randomize rode uma única vez. Rnd não é criptográfico, mas basta para testes. Na célula, =GerarCNPJ(VERDADEIRO; VERDADEIRO) devolve um CNPJ alfanumérico com máscara; ele passa na validação, mas pode coincidir com um CNPJ real por acaso. Copie e cole como valores para fixá-lo. Para centenas de números já em CSV, o gerador de CNPJ em lote é mais prático.

Formatar e limpar CNPJ em Excel

ModuloCNPJ.bas
Public Function LimparCNPJ(ByVal s As String) As String
  Dim i As Integer, c As String
  For i = 1 To Len(s)
      c = UCase$(Mid$(s, i, 1))
      If c Like "[A-Z0-9]" Then LimparCNPJ = LimparCNPJ & c
  Next i
End Function

Public Function FormatarCNPJ(ByVal s As String) As String
  Dim c As String
  c = LimparCNPJ(s)
  If Len(c) <> 14 Then Exit Function
  FormatarCNPJ = Left$(c, 2) & "." & Mid$(c, 3, 3) & "." & Mid$(c, 6, 3) & "/" & Mid$(c, 9, 4) & "-" & Right$(c, 2)
End Function

=FormatarCNPJ("12abc34501de35") devolve 12.ABC.345/01DE-35, e aplicar a função de novo no resultado não muda nada. Com tamanho diferente de 14, ela devolve texto vazio, o que facilita filtrar as linhas com problema.

Testes

Sem framework de testes no VBA, Debug.Assert resolve: se a condição for falsa, a execução para na linha com problema. Rode a macro pelo editor (F5).

ModuloCNPJ.bas
Public Sub TestarCNPJ()
  Dim i As Integer
  Debug.Assert ValidarCNPJ("11.222.333/0001-81")
  Debug.Assert ValidarCNPJ("12.ABC.345/01DE-35")
  Debug.Assert Not ValidarCNPJ("11.222.333/0001-82")
  Debug.Assert Not ValidarCNPJ("00.000.000/0000-00")
  For i = 1 To 1000
      Debug.Assert ValidarCNPJ(GerarCNPJ(False))
      Debug.Assert ValidarCNPJ(GerarCNPJ(True))
  Next i
  Debug.Assert FormatarCNPJ(FormatarCNPJ("12abc34501de35")) = "12.ABC.345/01DE-35"
  Debug.Print "TestarCNPJ: todos os casos passaram"
End Sub

A mensagem final aparece na janela Imediata (Ctrl+G). Mais números para testar estão nos exemplos de CNPJ alfanumérico para teste.

Usar a API em vez de reimplementar

A API do cpf.dev.br valida e gera CNPJs por HTTP, sem chave, com limite de 60 requisições por minuto por IP. Envie o CNPJ sem máscara, ou com a barra codificada como %2F. O objeto MSXML2.XMLHTTP existe só no Excel para Windows.

ModuloCNPJ.bas
Public Function ConsultarCNPJ(ByVal s As String) As String
  Dim http As Object
  Set http = CreateObject("MSXML2.XMLHTTP")
  http.Open "GET", "https://www.cpf.dev.br/api/v1/cnpj/validar/" & LimparCNPJ(s), False
  http.send
  ConsultarCNPJ = http.responseText
  ' {"valido":true,"cnpj":"12ABC34501DE35","formatado":"12.ABC.345/01DE-35",
  '  "formato":"alfanumerico","raiz":"12ABC345","ordem":"01DE","matriz":false}
End Function

Para extrair campos do JSON, use uma biblioteca de JSON para VBA ou o Power Query (Dados > Da Web). Para gerar uma lista, use /api/v1/cnpj/gerar?quantidade=5&formato=alfanumerico&formatado=true. Para conferir um número avulso, use o validador de CNPJ.

Leia também