Pular para o conteúdo
officetuning.aiofficetuning.ai
TreinamentosConsultoriaBibliotecaFerramentasConteúdoPortfólio
Entrar
officetuning.aiofficetuning.ai

Treinamento, consultoria e mentoria para decidir, construir e aprender nas quatro frentes da marca.

AI · Data · Productivity · Dev · São Paulo
contato@officetuning.ai
TreinamentosPower BIExcelSQLPowerPointIA + ProdutividadeTodos os treinamentos
PortalConsultoriaBibliotecaPortfólioBackground BuilderDashboard CanvasConteúdo
InstitucionalPolítica de privacidadeInformações legais
© 2026 officetuning.ai · São Paulo
  1. Biblioteca
  2. Power Query (M)
  3. UDFs M
  4. fnValidaCPF

fnValidaCPF

MValidação

Valida um CPF pelos dois dígitos verificadores.

Sintaxe

M
fnValidaCPF(CPF as any) as nullable logical

Parâmetros

CPFanyObrigatório

CPF formatado, sem formatação ou numérico. Coluna numérica tem o zero à esquerda reposto.

M
"123.456.789-09"

Tipo de retorno

nullable logical

Exemplos

M
fnValidaCPF("123.456.789-09")
// true

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

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

Código completo

M
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))

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.

Mais informações

Fonte
Paulo André Jesus — OfficeTuning
Versão
2.0
AnteriorfnValidaCNPJ
Biblioteca