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.
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.
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 FunctionPontos de atenção:
- Strings no VBA começam em 1.
Mid$(s, i, 1)lê o caractere da posiçãoi, e o laço vai de 1 aLen(s). Array(...)começa em 0 (semOption Base 1no módulo), por isso o peso é lido empesos(i - 1).Option Compare BinaryfazLike "[A-Z0-9]"recusar letras acentuadas.Exit FunctiondevolveFalse, o valor padrão de umBoolean; 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.
=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
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 FunctionA 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
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).
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 SubA 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.
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 FunctionPara 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.