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 textArgumentos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| NomeCompleto | nullable text | Sim | Nome 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 (’).