Valores por extenso no Power BI ou Excel
obs. o artigo foi escrito para Power Bi mas é facilmente adaptável ao Excel 2013 ou superior
Em uma discussão em um dos grupos que participo me perguntaram se havia uma forma de transformar os valores numéricos em numeros por extenso, exemplo R$ 10,10 em dez reais e dez centavos, na mesma hora indiquei o artigo do meu amigo Rafael Mendonça!
Pouco tempo depois a discussão voltou, apesar de ser uma solução fantástica ele demora muito para a carga dos dados quando número de informações é grande.
É claro que fui fazer um teste em um arquivo com 10000 linhas e a carga demorou pouco mais de 50 min (isso depende da velocidade da sua internet e do computador).
Como tempo é dinheiro decidi colocar a mão na massa e desenvolver a minha própria função em M para escrever numeros por extenso.
Nos testes com a nova função no mesmo arquivo fez o processamento das 10000 linhas em menos de 2 segundos
Abaixo segue como usar a função:
Vá até o editor do Power Query e adicione uma consulta nula
Abra o editor avançado
Apague tudo que tiver escrito no editor
Copie o código abaixo para área de trabalho
/* Função criada por Edney Franklin Siqueira e pode ser utilizada desde que citado o desenvolvedor. */ (valor as number) => let ext_0a20 = {"", " um ", " dois ", " três ", " quatro ", " cinco ", " seis ", " sete ", " oito ", " nove ", " dez ", " onze ", " doze ", " treze ", " quatorze ", " quinze ", " dezesseis ", " dezessete ", " dezoito ", " dezenove ", " vinte "}, ext_20a90 = { " vinte ", " trinta ", " quarenta ", " cinquenta ", " sessenta ", " setenta ", " oitenta ", " noventa "}, ext_100a900 = {"", " cento ", " duzentos ", " trezentos ", " quatrocentos ", " quinhentos ", " seiscentos ", " setecentos ", " oitocentos ", " novecentos " }, decimal = Text.PadStart( Text.From( Number.Round( (valor - Number.RoundDown(valor,0))*100,0) ) , 3, "0"), inteiro = Text.PadStart( Text.From( Number.RoundDown(valor,0) ), 15, "0"), numero = inteiro & decimal, tab_num = Text.ToList(numero), trilhao = Number.From( tab_num{00} )*100 + Number.From( tab_num{01} )*10 + Number.From( tab_num{02} ), bilhao = Number.From( tab_num{03} )*100 + Number.From( tab_num{04} )*10 + Number.From( tab_num{05} ), milhao = Number.From( tab_num{06} )*100 + Number.From( tab_num{07} )*10 + Number.From( tab_num{08} ), milhar = Number.From( tab_num{09} )*100 + Number.From( tab_num{10} )*10 + Number.From( tab_num{11} ), centena = Number.From( tab_num{12} )*100 + Number.From( tab_num{13} )*10 + Number.From( tab_num{14} ), centavo = Number.From( tab_num{15} )*100 + Number.From( tab_num{16} )*10 + Number.From( tab_num{17} ), classe_tril = if trilhao = 0 then "" else if trilhao = 1 then "trilhão " else "trilhões ", classe_bilh = if bilhao = 0 then "" else if bilhao = 1 then "bilhão " else "bilhões ", classe_milh = if milhao = 0 then "" else if milhao = 1 then "milhão " else "milhões ", classe_mil = if milhar = 0 then "" else "mil ", classe_real = if Number.RoundDown(valor,0) = 0 then "" else if Number.RoundDown(valor,0) = 1 then "real " else if centena+milhar = 0 then "de reais " else "reais ", classe_cent = if centavo = 0 then "" else if centavo = 1 then "centavo " else "centavos ", ordem_trilhao = if trilhao <= 20 then ext_0a20{trilhao} & classe_tril else if trilhao <= 99 then ext_20a90{ ( Number.From( tab_num{01} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{02} )} & classe_tril else if trilhao = 100 then " Cem " & classe_tril else if Number.From( tab_num{01} )*10 + Number.From( tab_num{02} ) <= 20 then ext_100a900{ (Number.From( tab_num{00} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{01} )*10 + Number.From( tab_num{02} )} & classe_tril else ext_100a900{ (Number.From( tab_num{00} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{01} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{02} )} & classe_tril, ordem_bilhao = if bilhao <= 20 then ext_0a20{bilhao} & classe_bilh else if bilhao <= 99 then ext_20a90{ ( Number.From( tab_num{04} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{05} )} else if bilhao = 100 then " Cem " & classe_bilh else if Number.From( tab_num{04} )*10 + Number.From( tab_num{05} ) <= 20 then ext_100a900{ (Number.From( tab_num{03} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{04} )*10 + Number.From( tab_num{05} )} & classe_bilh else ext_100a900{ (Number.From( tab_num{03} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{04} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{05} )} & classe_bilh, ordem_milhao = if milhao <= 20 then ext_0a20{milhao} & classe_milh else if milhao <= 99 then ext_20a90{ ( Number.From( tab_num{07} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{08} )} & classe_milh else if milhao = 100 then " Cem " & classe_milh else if Number.From( tab_num{07} )*10 + Number.From( tab_num{08} ) <= 20 then ext_100a900{ (Number.From( tab_num{06} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{07} )*10 + Number.From( tab_num{08} )} & classe_milh else ext_100a900{ (Number.From( tab_num{06} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{07} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{08} )} & classe_milh, ordem_milhar = if milhar <= 20 then ext_0a20{milhar} & classe_mil else if milhar <= 99 then ext_20a90{ ( Number.From( tab_num{10} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{11} )} & classe_mil else if milhar = 100 then " Cem " & classe_mil else if Number.From( tab_num{10} )*10 + Number.From( tab_num{11} ) <= 20 then ext_100a900{ (Number.From( tab_num{09} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{10} )*10 + Number.From( tab_num{11} )} & classe_mil else ext_100a900{ (Number.From( tab_num{09} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{10} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{11} )} & classe_mil, ordem_centena = if centena <= 20 then ext_0a20{centena} & classe_real else if centena <= 99 then ext_20a90{ ( Number.From( tab_num{13} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{14} )} & classe_real else if centena = 100 then " Cem " & classe_real else if Number.From( tab_num{13} )*10 + Number.From( tab_num{14} ) <= 20 then ext_100a900{ (Number.From( tab_num{12} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{13} )*10 + Number.From( tab_num{14} )} & classe_real else ext_100a900{ (Number.From( tab_num{12} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{13} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{14} )} & classe_real, ordem_centavo = if centavo <= 20 then ext_0a20{centavo} & classe_cent else ext_20a90{ (Number.From( tab_num{16} )*10-20)/10 } & "e" &ext_0a20{Number.From( tab_num{17} )} & classe_cent, e_trilhao = if trilhao > 0 and bilhao + milhao + milhar + centena + centavo > 0 then " e" else "", e_bilhao = if bilhao > 0 and milhao + milhar + centena + centavo > 0 then " e" else "", e_milhao = if milhao > 0 and milhar + centena + centavo > 0 then " e" else "", e_milhar = if milhar > 0 and centena + centavo > 0 then " e" else "", e_centena = if centena > 0 and centavo > 0 then " e" else "", extenso = ordem_trilhao & e_trilhao & ordem_bilhao & e_bilhao & ordem_milhao & e_milhao & ordem_milhar & e_milhar & ordem_centena & e_centena & ordem_centavo in
extenso
Cole o codigo no editor avançado
Clique em concluído
Agora você já pode usar a função personalizada para trazer os valores por extenso.
Você pode inserir um número de até 12 dígitos e 2 casas decimais
Mas você pode invocar a função para adicionar os valores por extenso a sua tabela:
Basta selecionar a tabela com os valores
Ir na guia adicionar colunas e escolher Invocar função personalizada
Após de um nome a sua nova coluna selecione a consulta com a função e qual a coluna com o valor numérico
E pronto os numeros estarão por extenso
Até uma próxima Powers!
Experiente Analista de Dados | Especializado em Power BI | Apaixonado por Business Intelligence e Modelagem de Dados
3 mEdney, thanks for sharing!
Engenheiro de dados | Analista de dados | Pentaho | Apache Hop | Spark | Python | Power Bi | Metabase
4 aParabéns por compartilhar o conhecimento Edney Siqueira. Muito útil.
Especialista em Logística | Key User SAP | AWS | Azure |Supply Chain | PBI | ERP | Planejamento | BID
4 aClaudiane Brenda
Gerente Executivo de Planejamento & Performance, Contabilista, discente em Economia e futuro Cientista de Dados
4 aSimplesmente sensacional
Consultorias e Treinamentos , Power BI e Excel na PainelBI
4 aeres um Monstro meu amigo, tá louco