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

fnFormataNome

MTexto

Capitaliza nomes próprios respeitando partículas, hífens, apóstrofos e os prefixos Mc/Mac.

Sintaxe

M
fnFormataNome(NomeCompleto as nullable text) as nullable text

Parâmetros

NomeCompletonullable textObrigatório

Nome em qualquer caixa. Espaços repetidos são ignorados.

M
"JOÃO MACHADO DE ASSIS"

Tipo de retorno

nullable text

Exemplos

M
fnFormataNome("ANGUS MCGREGOR MACDONALD")
// "Angus McGregor MacDonald"

fnFormataNome("JOÃO MACHADO DE MACEDO")
// "João Machado de Macedo"

fnFormataNome("MARÍA DE LAS MERCEDES")
// "María de las Mercedes"

fnFormataNome("BRIDGET O’REILLY DA SILVA-PEREIRA")
// "Bridget O’Reilly da Silva-Pereira"

Código completo

M
let
    fnFormataNome = (NomeCompleto as nullable text) as nullable text =>
        let
            // Partículas minúsculas quando não abrem o nome
            vParticulas = {
                "da", "das", "de", "do", "dos", "e",            // português
                "del", "la", "las", "lo", "los", "y",           // espanhol
                "di", "du",                                     // italiano, francês
                "von", "und", "zu", "der", "den",               // alemão
                "van", "ter", "ten",                            // neerlandês
                "bin", "bint", "ibn", "al", "ben", "bat"        // árabe, hebraico
            },
            // Sobrenomes com "Mac" + maiúscula (lista fechada)
            vMac = {"macarthur", "macdonald", "macgregor", "maclean", "macleod", "macmillan", "macneil", "macpherson"},
            fnCapitaliza = (p as text) as text =>
                if p = "" then "" else Text.Upper(Text.Start(p, 1)) & Text.End(p, Text.Length(p) - 1),
            // Formata um pedaço de palavra (entre hífens)
            fnParte = (p as text, primeira as logical) as text =>
                let
                    vApostrofo = if Text.Contains(p, "’") then "’" else if Text.Contains(p, "'") then "'" else null,
                    vPedacos = if vApostrofo = null then {p} else Text.Split(p, vApostrofo)
                in
                    if vApostrofo <> null and List.Count(vPedacos) = 2 then
                        fnCapitaliza(vPedacos{0}) & vApostrofo & fnCapitaliza(vPedacos{1})
                    else if not primeira and List.Contains(vParticulas, p) then p
                    else if Text.StartsWith(p, "mc") and Text.Length(p) > 2 then "Mc" & fnCapitaliza(Text.End(p, Text.Length(p) - 2))
                    else if List.Contains(vMac, p) then "Mac" & fnCapitaliza(Text.End(p, Text.Length(p) - 3))
                    else fnCapitaliza(p),
            // Espaços repetidos não geram palavra vazia
            vPalavras = List.Select(Text.SplitAny(Text.Lower(Text.Trim(NomeCompleto ?? "")), " #(tab)"), each _ <> ""),
            vFormatadas = List.Transform(
                List.Positions(vPalavras),
                (i) => Text.Combine(List.Transform(Text.Split(vPalavras{i}, "-"), (parte) => fnParte(parte, i = 0)), "-")
            )
        in
            if NomeCompleto = null then null else Text.Combine(vFormatadas, " "),

    Documentacao = [
        Documentation.Name = "fnFormataNome",
        Documentation.Description = "Capitaliza nomes próprios respeitando partículas, hífens, apóstrofos e Mc/Mac.",
        Documentation.LongDescription = "Partículas (de, da, del, van, von, bin...) ficam minúsculas, exceto na primeira palavra. Preserva o apóstrofo reto ou tipográfico. Mac só é tratado para os sobrenomes da lista vMac.",
        Documentation.Category = "Texto",
        Documentation.Author = "Paulo André Jesus",
        Documentation.Version = "3.0",
        Documentation.Examples = {
            [Description = "Mc e Mac", Code = "fnFormataNome(""ANGUS MCGREGOR MACDONALD"")", Result = """Angus McGregor MacDonald"""],
            [Description = "Sobrenome que começa com mac", Code = "fnFormataNome(""JOÃO MACHADO DE MACEDO"")", Result = """João Machado de Macedo"""],
            [Description = "Partículas compostas", Code = "fnFormataNome(""MARÍA DE LAS MERCEDES"")", Result = """María de las Mercedes"""],
            [Description = "Hífen e apóstrofo", Code = "fnFormataNome(""BRIDGET O’REILLY DA SILVA-PEREIRA"")", Result = """Bridget O’Reilly da Silva-Pereira"""]
        }
    ]
in
    Value.ReplaceType(fnFormataNome, Value.ReplaceMetadata(Value.Type(fnFormataNome), Documentacao))

Observações

Partículas (de, da, del, la, van, von, bin...) ficam minúsculas, exceto quando abrem o nome. Atenção Mac só vale para a lista fechada vMac: aplicar a todo nome que começa com "mac" gera "MacHado" e "MacEdo". Preserva o apóstrofo reto (') ou tipográfico (’).

Mais informações

Fonte
Paulo André Jesus — OfficeTuning
Versão
3.0
AnteriorfnFeriadosPróxima fnFormatWithLeadingZeros
Biblioteca