Code Library

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 logical

Argumentos

NomeTipoObrigatórioDescrição
CNPJanySimCNPJ 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")
// false

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