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 logicalArgumentos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| CPF | any | Sim | CPF 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.