
O que são UDF’s?
As UDFs (User-Defined Functions) no Power Apps são funções personalizadas que os usuários podem criar para reutilizar lógica em diferentes partes do aplicativo.
Saiba como criar e utilizar:
Porque usar UDF’s?
- Reutilização de Código – Evita duplicação de lógica ao centralizar cálculos e regras em um único local.
- Facilidade de Manutenção – Alterações na lógica podem ser feitas em um único lugar, reduzindo o risco de erros e inconsistências.
- Melhoria na Performance – Reduz a repetição de cálculos desnecessários ao armazenar valores já processados em variáveis ou coleções.
- Organização e Legibilidade – Torna o aplicativo mais estruturado, padronizado e fácil de entender, especialmente em projetos grandes.
Sobre o Pack
Fiz este pack com muito carinho e estou disponibilizando gratuitamente afim de colaborar com toda a comunidade Power Apps. Aprendi muito com conteúdos gratuitos por aí e nada mais justo do que retribuir esse favor. Com este pack vc será capaz de padronizar o seu App e elevar o seu nível de desenvolvimento. Sejam livres para usar e não repetir mais fórmulas!
Copie a UDF e cole na propriedade FORMULAS do seu APP. Para usá-la basta chamar o nome da UDF na expressão em qualquer parte do seu aplicativo.
📝 UDFs para Tratamento de Texto
Remover Espaços
fnRemoverEspacos(Texto:Text):Text=Substitute(Texto;Char(32);"");;
Remover Espaços Duplos
fnRemoverEspacosDuplos(Text:Text):Text=
Concat(
Filter(IfError(Split(Texto;Char(32));Blank());
!IsBlank(Value));Value;Char(32)
);;
Remover Acentos
fnRemoverAcentos(Texto:Text):Text=
With(
{
_Text:Texto;
_De: "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ";
_Para: "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
};
Concat(
ForAll(
Split(_Text;"");
If( Value in _De ; Mid(_Para;Find(Value;_De);1) ; Value )
);Value
)
);;
Remover Caracteres Especiais
fnRemoverEspeciais(Texto:Text):Text=
Concat(
ForAll(
Split(Texto;"");
If( IsMatch(Value;"[^\w\s]") ; ""; Value )
);Value
);;
Repetir Texto
fnRepetirTexto(Texto:Text;Separador:Text;Repeticoes:Number):Text=Concat(ForAll(Sequence(Repeticoes);Texto);Value;Separador);;
Capturar Dígitos
fnCapturarDigitos(Texto:Text):Text=Concat(MatchAll(Texto;Match.Digit);FullMatch);;
Capturar Extensão de Arquivo
fnCapturarExtensao(NomeComExtensao:Text):Text=Last(Split(NomeComExtensao ; "." )).Value;;
📅 UDFs para Formatação de Data e Hora
Formato de Data
fnFormatoData(DataHora:DateTime):Text=Text(DataHora;"dd/mm/yyyy");;
Formato de Hora
fnFormatoHora(DataHora:DateTime):Text=Text(DataHora;"hh:mm");;
Formato de Data e Hora
fnFormatoDataHora(DataHora:DateTime):Text=Text(DataHora;"dd/mm/yyyy hh:mm");;
Segundos em Hora
fnFormatoSegundosHora(TotalSegundos:Number):Text=${Text(RoundDown(TotalSegundos/3600;0);"00")}:{Text(Mod(RoundDown(TotalSegundos/60;0);60);"00")}";;
Minutos em Hora
fnFormatoMinutosHora(TotalMinutos:Number):Text=${Text(RoundDown(TotalMinutos/60;0);"00")}:{Text(Mod(TotalMinutos;60);"00")}";;
🔢 UDFs para Formatação Numérica
Moeda
fnFormatoMoeda(Valor:Number):Text=Text(Valor;"$ #,0.00";"pt-BR");;
Quantidade
fnFormatoQtde(Valor:Number):Text=Text(Valor;"#,0.00";"pt-BR");;
Percentual
fnFormatoPecentual(Valor:Number):Text=Text(Valor;"0.00%");;
Indicador Percentual
fnIndicadorPercentual(Valor:Number;MostrarZerado:Boolean):Text=With(
{
_Indicador:Switch(true;Valor>0;"▲";Valor<0;"▼";"▪");
_Cor:Switch(true;Valor>0;"#40A73F";Valor<0;"#F1416C";"#000")
};
If(!MostrarZerado && Valor=0;"";$"{_Indicador}{Text(Abs(Valor);"0.00%")}")
);;
✅ UDFs para Validação
Tem Espaço ou Caracter Especial
fnTemEspacoOuEspecial(Text:Text):Boolean=!IsEmpty(MatchAll(Text;"[^\w\s]")) || !IsBlank(Find(Char(32);Text));;
📊 UDFs para Operações de Cálculo
Dividir Valores
fnDivide(numerador:Number;denominador:Number):Number=IfError(numerador/denominador;0);;
Percentual da Referência
fnPercentual(Valor:Number;Ref:Number):Number= IfError( ((Valor - Ref) / Ref) * 100 ; 0 );;
Dias Úteis
fnDiasUteis(DataInicio:DateTime; DataFim:DateTime):Number=
IfError(
CountIf(
ForAll(
Sequence(DataFim-DataInicio+1);
DataInicio+Value-1
);
Weekday(Value) in [2; 3; 4; 5; 6]
);0
);;
Dias Úteis – Feriados
nfFeriados=[
{Data:DateValue("11/03/2025";"pt-BR");NomeFeriado:"Nome Feriado"};
{Data:DateValue("12/03/2025";"pt-BR");NomeFeriado:"Nome Feriado"}
];;
fnDiasUteisFeriado(DataInicio:DateTime; DataFim:DateTime):Number=
IfError(
CountIf(
ForAll(
Sequence(DataFim-DataInicio+1);
DataInicio+Value-1
);
Weekday(Value) in [2; 3; 4; 5; 6] && Not(Value in nfFeriados.Data)
);0
);;
Data Fim Útil
fnDataFimUtil(DataInicio: DateTime; QtdeDias: Number): DateTime =
IfError(
With({DataFim:DateAdd(DataInicio;QtdeDias*2;TimeUnit.Days)};
Last(
FirstN(
Filter(
ForAll(Sequence(DataFim-DataInicio+1);DataInicio+Value-1);
Weekday(Value) in [2; 3; 4; 5; 6]
);
QtdeDias
)
).Value
);
Blank()
);;
Data Fim Útil – Feriados
nfFeriados=[
{Data:DateValue("11/03/2025";"pt-BR");NomeFeriado:"Nome Feriado"};
{Data:DateValue("12/03/2025";"pt-BR");NomeFeriado:"Nome Feriado"}
];;
fnDataFimUtilFeriado(DataInicio: DateTime; QtdeDias: Number): DateTime =
IfError(
With({DataFim:DateAdd(DataInicio;QtdeDias*2;TimeUnit.Days)};
Last(
FirstN(
Filter(
ForAll(Sequence(DataFim-DataInicio+1);DataInicio+Value-1);
Weekday(Value) in [2; 3; 4; 5; 6] && Not(Value in nfFeriados.Data)
);
QtdeDias
)
).Value
);
Blank()
);;
💻 UDFs para Encode SVG
Encode SVG
fnEncodeSVG(SVG_Code:Text):Text="data:image/svg+xml;utf8, " & EncodeUrl(SVG_Code);;
Corrigir Cor SVG
fnCorrigirCorSVG(CorHexadecimal:Text;CodigoSVG:Text):Text=
With(
{
Color:Coalesce(CorHexadecimal;"#000");
SVG_Code:CodigoSVG
};
With({varLenth: Len(SVG_Code);varPosticao:Find(">";SVG_Code)};
With({varInputFill: If(CountRows(MatchAll(SVG_Code;"fill="))>0;SVG_Code; IfError(Left(SVG_Code;varPosticao-1);"") & " fill='" & Color & "'" & Right(SVG_Code;varLenth-varPosticao+1))};
With({varFixColor: Switch(true;"#000" in varInputFill;Substitute(varInputFill;"#000";Color);"currentColor" in varInputFill;Substitute(varInputFill;"currentColor";Color);varInputFill)};
"data:image/svg+xml;utf8, " & EncodeUrl(varFixColor)
)
)
)
);;
🎭 Bônus – UDF Máscara de Celular, CPF, CNPJ e CEP
Esta UDF é muito poderosa, você consegue customizar para qualquer máscara numérica.
nfMascaras=
ForAll(
[
{Formato:"CPF";Mascara:"##.###.###-##"};
{Formato:"CEP";Mascara:"##.###-###"};
{Formato:"CNPJ";Mascara:"##.###.###/####-##"};
{Formato:"CELULAR";Mascara:"(##) #####-####"}
];
Patch(ThisRecord;{MaxLenth:Len(Mascara)})
);;
fnMascara(entrada:Text;formato:Text):Text=
With(
{
_InputText:entrada;
_Mask:LookUp(nfMascaras As Mask;Mask.Formato=formato;Mask.Mascara)
};
With(
{
_TableMask:Split(_Mask;"");
_TableNumbers:MatchAll(_InputText;Match.Digit)
};
Concat(
ForAll(
Sequence(CountRows(_TableMask));
With({_Caracter:Index(_TableMask;Value).Value};
If(
_Caracter="#";
IfError(Index(_TableNumbers;CountRows(MatchAll(Left(_Mask;Value);"#"))).FullMatch;"0");
_Caracter
)
)
);
Value
)
)
);;
Eu ensino a utilizar essa UDF no vídeo abaixo:

Uma resposta
Show, muito bom o conteúdo. Obrigado por compartilhar!