Excel e macro VBA – função valor por extenso

Com o Excel e possível realizarmos qualquer ação que vai da mais simples a mais complexa. Nesse artigo estarei mostrando a vocês como criar uma macro que escreve o valor por extenso de um numeral qualquer digitado em uma célula.

Para que possamos obter esse resultado estaremos fazendo uso do VBA(Visual Basic for Applications) para escrever o código que vai executar a ação.
Para iniciar precisamos ativar a guia Desenvolvedor para aparecer essa opção da imagem nas guias padrão do Excel.

Primeiro passo inicial clicar em arquivo.
Segundo passo.

Apos ter clicado em arquivo e em opção vai aparacer uma nova janela com varias configurações para realizarmos dentro do Excel vamos escolher essa.

Terceiro passo.

Com a nova janela aberta segue as opções selecionadas com o quadrado vermelho para habilitar a guia desenvolvedor, clica em OK e pronto.

A guia Desenvolvedor esta habilitada.

As vezes em relação as versões do Excel esse passo a passo pode ter nome deferentes mais são as mesmas configurações para ativar a guia.

Clica na guia Desenvolvedor e na opção Visual Basic ou pressione Alt+F11 depois no menu Inserir clica em Modulo para adicionar.

Excel e Macro VBA – Definindo a Macro para Escrever por Extenso

O que é uma macro?
Uma macro é uma coleção de comandos que você pode aplicar com um único clique e executar uma determinada ação. As macros podem automatizar quase tudo que seja possível executar no programa que você está usando e até mesmo permitem fazer coisas que talvez você não soubesse que fossem possíveis.

As macros são programação, mas para usá-las, você não precisa ser um desenvolvedor e nem mesmo ter conhecimento de programação. A maioria das macros que você pode criar nos programas do Office são escritas em uma linguagem chamada Microsoft Visual Basic for Application, ou VBA.

Excel e Macro VBA – Agora que você já sabe o conceito de macro e para que ela serve, assim vai ficar bem mais fácil de entender como funcionara nossa macro.
Com o novo modulo inserido copia o código e cola dentro do Modulo inserido, caso queira digitar para aprender fica ao seu critério.

<code>Function Extenso_Valor(valor As Double) As String
Dim strMoeda    As String
Dim cents       As Variant
Dim decimalSep  As String
'   Se o valor for igual ou maior que 1 quatrilhao
'   passar erro e sair da funcao
If valor > 999999999999999# Then
Extenso_Valor = "Valor excede 999.999.999.999.999"
Exit Function
End If
'   Se valor for igual a 1, a unidade está no singular
If WorksheetFunction.RoundDown(valor, 0) = 1 Then
'       a string da moeda no singular
strMoeda = " real"
'       Se for maior que 1 a unidade está no plural
ElseIf WorksheetFunction.RoundDown(valor, 0) > 1 Then
strMoeda = " reais"
End If
'   Remove os centavos
cents = valor - WorksheetFunction.RoundDown(valor, 0)
'   Remove os centavos do valor
valor = valor - CDbl(cents)
'       Passo o extenso dos centavos
cents = centavos(CDbl(cents) * 100)
'    End If
'   Caso a string seja diferente de branco e valor seja maior ou igual a 1
If cents &lt;> "" And valor >= 1 Then
'       acrescentar uma vírgula antes do extenso
cents = " e " &amp; cents
End If
'   Iniciar o processo de conversao dos valores longos
strMoeda = Trim(Trilhoes(valor)) &amp; strMoeda &amp; cents
strMoeda = Replace(strMoeda, ", e", " e")
strMoeda = Replace(strMoeda, ", r", " r")
If Left(strMoeda, 2) = "e " Then
strMoeda = Mid(strMoeda, 3, Len(strMoeda))
'ElseIf Left(strMoeda, 5) = "mil e" Then
' strMoeda = Mid(strMoeda, 5, Len(strMoeda))
End If
vzz = "00000000000000000000"
vtam = Len(Trim(Mid(Trim(valor), 2, 100)))
If Right(vzz + vzz + vzz + vzz, vtam) = Mid(Trim(valor), 2, 100) And InStr(UCase(strMoeda), UCase("es ")) > 0 Then
vetor = Split(strMoeda, " ")
vtrocar = vetor(UBound(vetor))
strMoeda = Replace(strMoeda, vtrocar, "de " + vtrocar)
End If
Extenso_Valor = strMoeda
End Function
Private Function centavos(valor As Double) As String
Dim dezena      As Integer
Dim unidade     As Integer
'   Passa o valor para base decimal
valor = Round(CDbl(valor / 100), 2)
'   Se for um centavo, escrever valor e sair da funcao
If valor = 0.01 Then
centavos = "um centavo"
Exit Function
End If
'   Repassa valor para dezenas
valor = valor * 100
'   Se nao houver dezenas no valor passado
If dezenas(valor) = "" Then
'       a string centavos fica em branco
centavos = ""
Else
'       caso contrário, passar extenso das dezenas e concatenar
'       com a palavra centavos
centavos = dezenas(valor) &amp; " centavos"
End If
End Function
Private Function unidades(unidade As Double) As String
Dim unid(9)
'   Define as unidades a serem usadas
unid(1) = "um": unid(6) = "seis"
unid(2) = "dois": unid(7) = "sete"
unid(3) = "três": unid(8) = "oito"
unid(4) = "quatro": unid(9) = "nove"
unid(5) = "cinco"
'   Retorna a string referente a unidade passada para
'   esta funcao
unidades = Trim(unid(unidade))
End Function
Private Function dezenas(dezena As Double) As String
Dim dezes(9)
Dim dez(9)
Dim intDezena       As Double
Dim intUnidade      As Double
Dim tmpStr          As String
'   Define as dezenas a serem utilizadas
dezes(1) = "onze": dezes(6) = "dezesseis"
dezes(2) = "doze": dezes(7) = "dezessete"
dezes(3) = "treze": dezes(8) = "dezoito"
dezes(4) = "quatorze": dezes(9) = "dezenove"
dezes(5) = "quinze"
dez(1) = "dez": dez(6) = "sessenta"
dez(2) = "vinte": dez(7) = "setenta"
dez(3) = "trinta": dez(8) = "oitenta"
dez(4) = "quarenta": dez(9) = "noventa"
dez(5) = "cinquenta"
'   Calcula o inteiro da dezena
intDezena = Int(dezena / 10)
'   Calcula o inteiro da unidade
intUnidade = dezena Mod 10
'   Se o inteiro da dezena for zero
If intDezena = 0 Then
'       dezenas sao iguais as unidades
dezenas = unidades(intUnidade)
Exit Function
Else:
'       caso contrário, é igual a dez
dezenas = dez(intDezena)
End If
'   Se o inteiro da dezena for igual a 1 e
'   o inteiro da unidade for zero, os valores estao
'   entre 11 e 19
If (intDezena = 1 And intUnidade > 0) Then
dezenas = dezes(intUnidade)
Else
'   Caso contrário, valor está entre 20 e 90 inclusive
If (intDezena > 1 And intUnidade > 0) Then
'           Concatena a string da dezena com a string da unidade
dezenas = dezenas &amp; " e " &amp; unidades(intUnidade)
End If
End If
dezenas = dezenas
End Function
Private Function centenas(centena As Double) As String
Dim tmpCento      As Double
Dim tmpDez        As Double
Dim tmpUni        As Double
Dim tmpUniMod     As Double
Dim tmpModDez     As Double
Dim centoString   As String
Dim cento(9)
'   Define as centenas
cento(1) = "cento": cento(6) = "seiscentos"
cento(2) = "duzentos": cento(7) = "setecentos"
cento(3) = "trezentos": cento(8) = "oitocentos"
cento(4) = "quatrocentos": cento(9) = "novecentos"
cento(5) = "quinhentos"
'   Calcula o inteiro da centena
tmpCento = Int(centena / 100)
'   Calcula a parte da dezena
tmpDez = centena - (tmpCento * 100)
'   Calcula o inteiro da unidade
tmpUni = Int(tmpDez / 10)
'   Calcula o resto da unidade
tmpUniMod = tmpUni Mod 10
'   Calcula o resto da dezena
tmpModDez = tmpDez Mod 10
'   Se centena for cem, definir string como "cem " e sair
If centena = 100 Then
centoString = "cem "
Else
'   Caso contrário definir a string da centena
centoString = cento(tmpCento)
End If
'   Avalia se a unidade é maior ou igual a zero, se o resto da unidade é igual ou
'   maior que zero, se a dezena é maior ou igual a um e se a centena é igual ou
'   maior que 1. Se forem verdadeiros; entao, adicionar " e " a string da centena
If (tmpUni >= 0 And tmpUniMod >= 0 And tmpDez >= 1 And tmpCento >= 1) Then
centoString = centoString &amp; " e "
End If
'   Concatena a string do cento com a string da dezena
centenas = Trim(centoString &amp; dezenas(tmpDez))
End Function
Private Function milhares(milhar As Double) As String
Dim tmpMilhar      As Double
Dim tmpCento       As Double
Dim milString      As String
'   Calcula o inteiro da milhar
tmpMilhar = Int(milhar / 1000)
'   Calcula o cento dentro da milhar
tmpCento = milhar - (tmpMilhar * 1000)
'   Se milhar for zero, entao a string da milhar fica em branco
If tmpMilhar = 0 Then milString = ""
'   Se for igual a 1, entao
'   If '(tmpMilhar = 1) Then
'       string da milhar é igual a unidade e "mil"
'milString = unidades(tmpMilhar) &amp; "um mil "
'       se maior que 1 e menor que dez, string igual a unidades
If (tmpMilhar >= 1 And tmpMilhar &lt; 10) Then
milString = unidades(tmpMilhar) &amp; " mil, "
'           Se for entre 10 e 100, entao string igual a dezenas
ElseIf (tmpMilhar >= 10 And tmpMilhar &lt; 100) Then
milString = dezenas(tmpMilhar) &amp; " mil, "
'               Se for entre 100 e 1000, entao igual string centenas
ElseIf (tmpMilhar >= 100 And tmpMilhar &lt; 1000) Then
milString = centenas(tmpMilhar) &amp; " mil, "
End If
'If tmpCento = 1 Then milString = " e "
If (tmpCento >= 1 And tmpCento &lt;= 100) Then milString = milString &amp; "e "
milhares = Trim(milString &amp; centenas(tmpCento))
End Function
Private Function milhoes(milhao As Double) As String
'   Ver comentários para milhares acima
Dim tmpMilhao      As Double
Dim tmpMilhares    As Double
Dim miString       As String
tmpMilhao = Int(milhao / 1000000)
tmpMilhares = milhao - (tmpMilhao * 1000000)
If tmpMilhao = 0 Then miString = ""
If (tmpMilhao = 1) Then
miString = unidades(tmpMilhao) &amp; " milhão, "
ElseIf (tmpMilhao > 1 And tmpMilhao &lt; 10) Then
miString = unidades(tmpMilhao) &amp; " milhões, "
ElseIf (tmpMilhao >= 10 And tmpMilhao &lt; 100) Then
miString = dezenas(tmpMilhao) &amp; " milhões, "
ElseIf (tmpMilhao >= 100 And tmpMilhao &lt; 1000) Then
miString = centenas(tmpMilhao) &amp; " milhões, "
End If
If milhao = 1000000# Then miString = "um milhão de "
milhoes = Trim(miString &amp; milhares(tmpMilhares))
End Function
Private Function bilhoes(bilhao As Double) As String
'   Ver comentários para milhares acima
Dim tmpBilhao     As Double
Dim tmpMilhao       As Double
'Dim tmpMilhoes      As Double
Dim biString       As String
tmpBilhao = Int(bilhao / 1000000000)
tmpMilhao = bilhao - (tmpBilhao * 1000000000)
If (tmpBilhao = 1) Then
biString = unidades(tmpBilhao) &amp; " bilhão, "
ElseIf (tmpBilhao > 1 And tmpBilhao &lt; 10) Then
biString = unidades(tmpBilhao) &amp; " bilhões, "
ElseIf (tmpBilhao >= 10 And tmpBilhao &lt; 100) Then
biString = dezenas(tmpBilhao) &amp; " bilhões, "
ElseIf (tmpBilhao >= 100 And tmpBilhao &lt; 1000) Then
biString = centenas(tmpBilhao) &amp; " bilhões, "
End If
If bilhao = 1000000000# Then biString = "um bilhão de "
bilhoes = Trim(biString &amp; milhoes(tmpMilhao))
End Function
Private Function Trilhoes(Trilhao As Double) As String
'   Ver comentários para milhares acima
Dim tmpTrilhao     As Double
Dim tmpBilhao       As Double
Dim triString       As String
tmpTrilhao = Int(Trilhao / 1000000000000#)
tmpBilhao = Trilhao - (tmpTrilhao * 1000000000000#)
If (tmpTrilhao = 1) Then
triString = unidades(tmpTrilhao) &amp; " trilhão, "
ElseIf (tmpTrilhao > 1 And tmpTrilhao &lt; 10) Then
triString = unidades(tmpTrilhao) &amp; " trilhões, "
ElseIf (tmpTrilhao >= 10 And tmpTrilhao &lt; 100) Then
triString = dezenas(tmpTrilhao) &amp; " trilhões, "
ElseIf (tmpTrilhao >= 100 And tmpTrilhao &lt; 1000) Then
triString = centenas(tmpTrilhao) &amp; " trilhões, "
End If
If Trilhao = 1000000000000# Then triString = "um trilhão de "
Trilhoes = Trim(triString &amp; bilhoes(tmpBilhao))
End Function
Function arredBaixo(valor)
Dim tmpValor
tmpValor = Round(CDbl(Right(Round(valor, 2) * 100, 2)) / 100, 2)
arredBaixo = Round(Round(valor, 2) - tmpValor, 0)
End Function</code>

Excel e Macro VBA – Atribuindo a Macro a uma formulário

Retorne a planilha e escolha uma célula qualquer e vamos inserir a função que acabamos de cria para exibir o valor por extenso.

Clica em inserir função onde esta destacado e apos aparecer essa janela, escolha na caixinha a seguinte palavra “Definida pelo o usuário”. Perceba que a nossa função vai aparecer “Extenso_Valor”, selecione ela e clica em OK para passarmos para a próxima etapa.

Excel e Macro VBA. Aponta para o argumento da função dentro da caixa de texto onde está a sua referencia o melhor dizendo o seu valor que quer passar para texto. Veja que ao indicar para a caixa de texto que o valor esta na célula A3 e possível visualizar como vai aparecer na célula e uma serie de informações a mais relevantes.

Valor passado para forma de texto.

Para que as iniciais ficam em letras maiúsculas basta fazer o uso da brilhante função padrão do Excel a =PRI.MAIÚSCULA() que sera convertido para maiúsculas as iniciais de cada nome.

Pessoal era isso que tinha para passar para vocês hoje. Em nosso site temos muitas novidades não deixa de conferir.

Este código não é de minha autoria foi repassado por um colaborador. Apenas fiz algumas incrementações nas imagens.

Fonte: http://www.macoratti.net/14/04/vba_ext1.htm

Veja mais…

Planilhas para a gestão do seu negócio em Excel

Gerar orçamento em Excel e salvar em PDF

Planilha simulador de parcelamento em Excel

Como controlar recebimentos em cartões de crédito

A Importância do Fluxo de Caixa nas Empresas

Sistema Controle de Contas a Pagar e Receber

Planilha agenda de contato corporativo em Excel

Planilha para Controlar de Dízimos e Ofertas em Excel

Baixa a planilha para usa-la.