M · UDF
fnValidaCNPJ
Valida um CNPJ numérico ou alfanumérico pelos dois dígitos verificadores.
Categoria: ValidaçãoTipo: UDFVersão: v2.0Fonte: Paulo André Jesus — OfficeTuning · regra do DV: Receita FederalAtualizado em: 25/09/2026
Documentação completa na Function Library →Sintaxe
fnValidaCNPJ(CNPJ as any) as nullable logicalArgumentos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| CNPJ | any | Sim | CNPJ formatado, sem formatação ou numérico. Letras minúsculas viram maiúsculas. |
Retorno
nullable logical
Código completo
let
fnValidaCNPJ = (CNPJ as any) as nullable logical =>
let
vTexto =
if CNPJ = null then null
else if CNPJ is number then Text.PadStart(Text.From(Number.Abs(CNPJ), "en-US"), 14, "0")
else if CNPJ is text then Text.Upper(CNPJ)
else Text.Upper(Text.From(CNPJ)),
vLimpo = Text.Select(vTexto ?? "", {"0".."9", "A".."Z"}),
// Valor de cada caractere: código ASCII - 48
vValores = List.Transform(Text.ToList(vLimpo), each Character.ToNumber(_) - 48),
fnDigito = (base as list) as number =>
let
// 12 posições: 5,4,3,2,9..2 | 13 posições: 6,5,4,3,2,9..2
vPesos = List.LastN({6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2}, List.Count(base)),
vResto = Number.Mod(List.Sum(List.Transform(List.Positions(base), (i) => base{i} * vPesos{i})), 11)
in
if vResto < 2 then 0 else 11 - vResto,
vBase = List.FirstN(vValores, 12),
vDV1 = fnDigito(vBase),
vDV2 = fnDigito(vBase & {vDV1})
in
if vTexto = null then null
else Text.Length(vLimpo) = 14
and Text.Select(Text.End(vLimpo, 2), {"0".."9"}) = Text.End(vLimpo, 2)
and List.Count(List.Distinct(vValores)) > 1
and vDV1 = vValores{12}
and vDV2 = vValores{13},
Documentacao = [
Documentation.Name = "fnValidaCNPJ",
Documentation.Description = "Valida um CNPJ numérico ou alfanumérico pelos dígitos verificadores.",
Documentation.LongDescription = "Aceita CNPJ formatado, sem formatação ou numérico. Letras minúsculas são convertidas para maiúsculas. Rejeita sequências repetidas. Entrada null retorna null.",
Documentation.Category = "Validação",
Documentation.Author = "Paulo André Jesus",
Documentation.Version = "2.0",
Documentation.Examples = {
[Description = "CNPJ numérico", Code = "fnValidaCNPJ(""12.345.678/0001-95"")", Result = "true"],
[Description = "CNPJ alfanumérico (exemplo da Receita Federal)", Code = "fnValidaCNPJ(""12.ABC.345/01DE-35"")", Result = "true"],
[Description = "Dígito errado", Code = "fnValidaCNPJ(""12.345.678/0001-00"")", Result = "false"]
}
]
in
Value.ReplaceType(fnValidaCNPJ, Value.ReplaceMetadata(Value.Type(fnValidaCNPJ), Documentacao))Exemplos
fnValidaCNPJ("12.345.678/0001-95")
// true
fnValidaCNPJ("12.ABC.345/01DE-35")
// true (alfanumérico — exemplo da Receita Federal)
fnValidaCNPJ("12.345.678/0001-00")
// falseDicas e observações
💡 CNPJ alfanumérico: emitido desde julho de 2026. As 12 primeiras posições aceitam A–Z; os dois dígitos verificadores continuam numéricos. 💡 Cada caractere vale o código ASCII menos 48 (A = 17, Z = 42), com os mesmos pesos e o mesmo módulo 11. ⚠️ Coluna de CNPJ do tipo Número inteiro não comporta o alfanumérico: mude para Texto na origem e no modelo.