Code Library

M · UDF

fnFormataNome

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

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

Sintaxe

fnFormataNome(NomeCompleto as nullable text) as nullable text

Argumentos

NomeTipoObrigatórioDescrição
NomeCompletonullable textSimNome em qualquer caixa. Espaços repetidos são ignorados.

Retorno

nullable text

Código completo

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

Exemplos

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"

Dicas e observações

💡 Partículas (de, da, del, la, van, von, bin...) ficam minúsculas, exceto quando abrem o nome. ⚠️ 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 (’).