Code Library

M · UDF

fnValidaCPF

Valida um CPF pelos dois dígitos verificadores.

Categoria: ValidaçãoTipo: UDFVersão: v2.0Fonte: Paulo André Jesus — OfficeTuningAtualizado em: 25/09/2026
Documentação completa na Function Library →

Sintaxe

fnValidaCPF(CPF as any) as nullable logical

Argumentos

NomeTipoObrigatórioDescrição
CPFanySimCPF formatado, sem formatação ou numérico. Coluna numérica tem o zero à esquerda reposto.

Retorno

nullable logical

Código completo

let
    fnValidaCPF = (CPF as any) as nullable logical =>
        let
            vTexto =
                if CPF = null then null
                else if CPF is number then Text.PadStart(Text.From(Number.Abs(CPF), "en-US"), 11, "0")
                else if CPF is text then CPF
                else Text.From(CPF),
            vDigitos = Text.Select(vTexto ?? "", {"0".."9"}),
            vNumeros = List.Transform(Text.ToList(vDigitos), Number.FromText),
            // Pesos decrescentes a partir de (tamanho + 1); resto 10 vira 0
            fnDigito = (base as list) as number =>
                let
                    vSoma = List.Sum(List.Transform(List.Positions(base), (i) => base{i} * (List.Count(base) + 1 - i))),
                    vResto = Number.Mod(vSoma * 10, 11)
                in
                    if vResto = 10 then 0 else vResto,
            vDV1 = fnDigito(List.FirstN(vNumeros, 9)),
            vDV2 = fnDigito(List.FirstN(vNumeros, 9) & {vDV1})
        in
            // "and" para no primeiro false: vNumeros{9} só é lido com 11 dígitos
            if vTexto = null then null
            else Text.Length(vDigitos) = 11
                and List.Count(List.Distinct(vNumeros)) > 1
                and vDV1 = vNumeros{9}
                and vDV2 = vNumeros{10},

    Documentacao = [
        Documentation.Name = "fnValidaCPF",
        Documentation.Description = "Valida um CPF pelos dígitos verificadores.",
        Documentation.LongDescription = "Aceita CPF formatado (123.456.789-09), sem formatação ou numérico. Rejeita sequências repetidas (111.111.111-11). Entrada null retorna null.",
        Documentation.Category = "Validação",
        Documentation.Author = "Paulo André Jesus",
        Documentation.Version = "2.0",
        Documentation.Examples = {
            [Description = "CPF válido", Code = "fnValidaCPF(""123.456.789-09"")", Result = "true"],
            [Description = "Dígito errado", Code = "fnValidaCPF(""123.456.789-00"")", Result = "false"],
            [Description = "Sequência repetida", Code = "fnValidaCPF(""111.111.111-11"")", Result = "false"]
        }
    ]
in
    Value.ReplaceType(fnValidaCPF, Value.ReplaceMetadata(Value.Type(fnValidaCPF), Documentacao))

Exemplos

fnValidaCPF("123.456.789-09")
// true

fnValidaCPF("123.456.789-00")
// false  (dígito errado)

fnValidaCPF("111.111.111-11")
// false  (sequência repetida)

Dicas e observações

💡 Entrada null retorna null — separe "sem CPF" de "CPF inválido". 💡 O "and" do M para no primeiro false: os dígitos só são lidos quando há 11.