Olá queridos leitores.
Hoje disponibilizo a vocês uma formulazinha muito importante no nosso cotidiano. E aproveito para refletir um pouco. Por que será que o Excel já não disponibiliza nativamente uma função para executar a leitura de um número por extenso? Caramba! Que fórmula chatinha de desenvolver! Visto do ponto que o resultado é algo tão simples. Para vocês terem uma idéia, para que o excel escreva cem reais, por exemplo, ele tem que verificar se existem casas decimais, quantos algarismos possui o número, a que grupo de milhar ou centena pertence, se a unidade é decimal ou não, se o valor é maior ou igual a cem, porque se for 100, escreve-se “cem”, se for 101 ou mais, escreve-se “cento”. Haja paciência. Isto sem contar nos conectores do tipo “e”, “reais” ou “centavos”. Diferenciando-se, valores unitários dos demais, para definir se o termo virá no singular ou no plurar.
Apesar de tudo isso, essa fórmula é essencial ao nosso uso. Muitas aplicações ficam mais apresentáveis e profissionais com sua aplicação. Uma planilha de recibo por exemplo. Onde se exibe o valor pago, fica bem mais perfeito e atraente se estiver esse valor descrito de forma textual também. até mesmo se o intuito for imprimir. Bem mais aceitável.
Mas como não estou aqui para reclamar, tenho uma sugestão: Vamos começar logo porque senão vamos perder o jantar…
No excel vamos criar uma função personalizada que irá fazer os cálculos e análises num módulo do projeto VBA e será acessada diretamente na célula onde deseja exibir o resultado. Chame a fórmula assim:
=ConverterParaExtenso(A2)
Onde A2 é onde se encontra o valor a descrever por extenso.

Não vou me deter muito em exlicações detalhadas, visto que, a maioria do processo é de fácil conhecimento e entendimento. É apenas um procedimento de muito cálculoo e análise. Portanto, preste bastante atenção.
O código abaixo deve ser escrito num Módulo. Farei alguns comentários em seguida.
Public Function ConverterParaExtenso(NumeroParaConverter As String) As String
Dim sExtensoFinal As String, sExtensoAtual As String
Dim i As Integer
Dim iQtdGrupos As Integer
Dim sDecimais As String
Dim sMoedaSing As String, sMoedaPlu As String, sCentavos As String
Dim bSufMoeda As Boolean
'Separa os Decimais
If InStr(1, NumeroParaConverter, ",") > 0 Then
sDecimais = Right(NumeroParaConverter, Len(NumeroParaConverter) - InStr(1, NumeroParaConverter, ","))
NumeroParaConverter = Mid(NumeroParaConverter, 1, InStr(1, NumeroParaConverter, ",") - 1)
End If
'Obtém a separação de milhares
iQtdGrupos = Fix(Len(NumeroParaConverter) / 3)
If Len(NumeroParaConverter) Mod 3 > 0 Then
iQtdGrupos = iQtdGrupos + 1
End If
'Chama as funções para escrever o número
If iQtdGrupos > 2 Then bSufMoeda = True
For i = iQtdGrupos To 1 Step -1
sExtensoAtual = DesmembraValor(NumeroParaConverter, i)
If i = 1 Then
If sExtensoAtual = "" Then
sExtensoFinal = sExtensoFinal & sExtensoAtual
Else
If sExtensoFinal = "" Then
sExtensoFinal = sExtensoFinal & sExtensoAtual
Else
sExtensoFinal = sExtensoFinal & " e " & sExtensoAtual
End If
End If
Else
sExtensoFinal = sExtensoFinal & sExtensoAtual
End If
If iQtdGrupos > 2 Then
Select Case i
Case 1, 2
If sExtensoAtual <> "" Then
bSufMoeda = False
End If
End Select
End If
Next i
'Define a moeda
sMoedaPlu = " reais"
sMoedaSing = " real"
If bSufMoeda = True Then sMoedaPlu = " de reais"
'Escreve os Centavos
sCentavos = EscreveCentavos(sDecimais)
'Adiciona a moeda e os centavos
sExtensoFinal = IIf((sExtensoFinal = ""), "", sExtensoFinal & IIf((sExtensoFinal = "um"), sMoedaSing, sMoedaPlu)) _
& IIf((sExtensoFinal = ""), sCentavos, IIf((sCentavos = ""), "", " e " & sCentavos))
'retorna o resultado
ConverterParaExtenso = sExtensoFinal
End Function
Private Function DesmembraValor(sValor As String, iGrupoDiv As Integer) As String
Dim iValor As Integer
Dim sExtenso As String
Dim iDivResto As Integer
Dim iDivInteiro As Integer
Dim iPosInicMid As Integer
Dim iTamMid As Integer
Dim sComplemento As String
Dim vArrDez1 As Variant
Dim vArrDez2 As Variant
Dim vArrCentena As Variant
vArrDez1 = Array("", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", _
"dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", _
"dezoito", "dezenove")
vArrDez2 = Array("vinte", "trinta", "quarenta", "cinquenta", "sessenta", _
"setenta", "oitenta", "noventa")
vArrCentena = Array("cem", "cento", "duzentos", "trezentos", "quatrocentos", _
"quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos")
'Pega o Valor a ser escrito e desmembra para o grupo numérico correto
iPosInicMid = Len(sValor) - ((3 * iGrupoDiv) - 1)
If iPosInicMid <= 1 Then
iTamMid = 2 + iPosInicMid
Else
iTamMid = 3
End If
If iPosInicMid < 1 Then iPosInicMid = 1
iValor = CInt(Mid(sValor, iPosInicMid, iTamMid))
Select Case iGrupoDiv
Case 2
sComplemento = " mil "
Case 3
If iValor = 1 Then
sComplemento = " milhão "
Else
sComplemento = " milhões "
End If
Case 4
If iValor = 1 Then
sComplemento = " bilhão "
Else
sComplemento = " bilhões "
End If
Case 5
If iValor = 1 Then
sComplemento = " trilhão "
Else
sComplemento = " trilhões "
End If
End Select
Select Case iValor
Case 0 To 19
sExtenso = vArrDez1(iValor)
Case 20 To 99
iDivInteiro = Fix(iValor / 10)
iDivResto = iValor Mod 10
If iDivResto = 0 Then
sExtenso = vArrDez2(iDivInteiro - 2)
Else
sExtenso = vArrDez2(iDivInteiro - 2) & " e " & vArrDez1(iDivResto)
End If
Case 100 To 999
iDivInteiro = Fix(iValor / 100)
iDivResto = iValor Mod 100
If iDivResto = 0 Then
If iDivInteiro = 1 Then
sExtenso = vArrCentena(0) 'Cem
Else
sExtenso = vArrCentena(iDivInteiro) 'inteiro maior que 100
End If
Else
sExtenso = vArrCentena(iDivInteiro) & " e "
Select Case iDivResto
Case 0 To 19
sExtenso = sExtenso & vArrDez1(iDivResto)
Case 20 To 99
iDivInteiro2 = Fix(iDivResto / 10)
iDivResto2 = iDivResto Mod 10
If iDivResto2 = 0 Then
sExtenso = sExtenso & vArrDez2(iDivInteiro2 - 2)
Else
sExtenso = sExtenso & vArrDez2(iDivInteiro2 - 2) & " e " & vArrDez1(iDivResto2)
End If
End Select
End If
End Select
DesmembraValor = sExtenso & IIf(iValor > 0, sComplemento, "")
End Function
Private Function EscreveCentavos(sCent As String) As String
Dim sExtenso As String
Dim iDivResto As Integer
Dim iDivInteiro As Integer
Dim sComplemento As String
Dim vArrDez1 As Variant
Dim vArrDez2 As Variant
Dim iCent As Integer
vArrDez1 = Array("", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", _
"dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", _
"dezoito", "dezenove")
vArrDez2 = Array("vinte", "trinta", "quarenta", "cinquenta", "sessenta", _
"setenta", "oitenta", "noventa")
'Adequando para duas casas decimais
iCent = Fix(sCent & String(2 - Len(sCent), "0"))
'Escrevendo Singular ou plural
If iCent = 1 Then
sComplemento = " centavo"
Else
sComplemento = " centavos"
End If
'Calculando os valores
Select Case iCent
Case 0 To 19
sExtenso = vArrDez1(iCent)
Case 20 To 99
iDivInteiro = Fix(iCent / 10)
iDivResto = iCent Mod 10
If iDivResto = 0 Then
sExtenso = vArrDez2(iDivInteiro - 2)
Else
sExtenso = vArrDez2(iDivInteiro - 2) & " e " & vArrDez1(iDivResto)
End If
End Select
EscreveCentavos = IIf(iCent > 0, sExtenso & sComplemento, "")
End Function
Existem três funções no código:
- Public Function ConverterParaExtenso(NumeroParaConverter As String) As String
- Private Function DesmembraValor(sValor As String, iGrupoDiv As Integer) As String
- Private Function EscreveCentavos(sCent As String) As String
Vamos começar pela mais simples, EscreveCentavos. Esta função é privada, portanto é disponível apenas ao acesso interno. Ela verifica a presença de decimais e escreve seu conteúdo.
Nas linhas 178 a 183 foram declaradas duas matrizes que contém os valores textuais para os números de 1 a 19 e de 20 a 90, em múltiplos de 10, respectivamente.
Nas linhas 189 a 193, efetua-se uma verificação para saber se o valor textual para o termo “centavos” deve estar no singular, no caso de apenas 1 centavo, ou no plural, para os demais valores.
Nas linhas de 196 a 208 são feitos todos os cálculos e atribuições de valores. Descobrindo-se o valor em número e substituindo-o pelo seu correspondente textual armazenado nas matrizes definidas no início.
Por fim, na linha 210 é exibido o resultado obtido, atentando-se ao fato de que se não houver valor nenhum, ou seja, 0 centavos, será retornado vazio.
Na função DesmembraValor, segue-se o mesmo raciocínio, apenas com algumas adições como, por exemplo, nas linhas de 90 a 100, a verificação à qual grupo de milhar ou centena pertence o número analizado.
Nas linhas de 102 a 123, define-se os termos identificadores do grupo. Milhões, bilhões, trilhões. E analisando, é claro, se estão no singular ou no plural. De 125 a 164 é feito todo o cálculo para definir as expressões textuais dos números baseando-se nas matrizes definidas anteriormente.
Enfim, a função que será acessada pelo Excel, ConverterParaExtenso. Nas linhas de 24 a 48 é realizado um loop para executar a função que excreve o valor por extenso de cada grupo numérico separadamente. A função para tal é chamada na linha 25. Em seguida, ainda dentro do loop são feitas verificações para definir conectores do tipo “e” e “moeda”.
Na linha 57 executamos a leitura dos centavos. Nas linhas 60 e 61, juntamos tudo. E, por fim, na linha 64, enviamos o resultado para a função retornar à célula que a chamou.
Amigos, obrigado pelo seu prestígio. Aguardo vocês sempre.
Um abraço.
Termos aprendidos neste artigo:
| InStr | Retorna uma Variant (Long) que especifica a posição da primeira ocorrência de uma seqüência de caracteres dentro de outra.
Sintaxe InStr([start, ]string1, string2[, compare]) A sintaxe da função InStr tem os seguintes argumentos:
Definições As configurações do argumento compare são as seguintes:
Valores retornados
|
|||||||||||||||||||||||||||||||||||||||||
| Len | Retorna um Long que contém o número de caracteres existentes em uma seqüência de caracteres ou o número de bytes necessários para armazenar uma variável.
Sintaxe Len(string | varname) A sintaxe da função Len tem as seguintes partes:
|
|||||||||||||||||||||||||||||||||||||||||
| Mid | Retorna uma Variant (String) que contém um número especificado de caracteres de uma seqüência de caracteres.
Sintaxe Mid(string, start[, length]) A sintaxe da função Mid tem os seguintes argumentos nomeados:
Comentários Para determinar o número de caracteres em string, use a função Len. |
|||||||||||||||||||||||||||||||||||||||||
| Right | Retorna uma Variant (String) que contém um número especificado de caracteres, a partir do lado direito de uma seqüência de caracteres.
Sintaxe Right(string, length) A sintaxe da função Right tem os seguintes argumentos nomeados:
|
|||||||||||||||||||||||||||||||||||||||||
| Array | Retorna um Variant contendo uma matriz.
Sintaxe Array(arglist) O argumento obrigatório arglist é uma lista de valores delimitados por vírgulas que são atribuídos aos elementos da matriz contidos dentro de Variant. Se nenhum argumento for especificado, uma matriz de tamanho zero será criada. Comentários A notação usada para referir-se a um elemento de uma matriz consiste no nome de uma variável seguido por um número de índice entre parênteses indicando o elemento desejado. No exemplo a seguir, a primeira instrução cria uma variável denominada A como um Variant. A segunda instrução atribui uma matriz à variável A. A última instrução atribui o valor contido no segundo elemento de matriz a outra variável. Dim A As Variant A = Array(10,20,30) B = A(2) |




1 2 3 4 5 . 0 1 2 3 4 5 6 7 8 9
5 8 6 5 1 1 2 1 1
3 4 0 6 8 1 1 1 1 1
7 5 1 4 5 1 1 2 1
0 7 8 1 3 qual a formula
3 3 3 4 3 para contar desta forma
0 5 3 4 2 para que fique assim
1 0 1 7 0 como no grafico
1 1 5 6 3
Reply
Reinaldo Coral Reply:
setembro 2nd, 2009 at 18:27
Caro Sebastião,
Não entendi o que você quer! Poderia explicar melhor?
Abraço.
Reply
Aonde esta
Coluna a,b,c,d,e tenho 5 colunas subseqüentes
Só que dentro de cada coluna os números variam de maneira desordenada
A b c d E . f g h i j k l m n O
5 8 6 5 1 1 2 1 1
3 4 0 6 8 1 1 1 1 1
7 5 1 4 5 1 1 2 1
0 7 8 1 3 Qual a formula
3 3 3 4 3 Para contar desta forma
0 5 3 4 2 Para que fique assim
1 0 1 7 0 Como no gráfico
1 1 5 6 3
Ai tem uma referencia que
A coluna f =0
A coluna g =1
A coluna h =1
Só que dentro desta coluna a1 você vê que o 5 repetiu 2 vezes
Variando ate 0,1,2,3,4,5,6,7,8,9, qual a formula para que eu conte
Entre as
Se você colar no Excel terá a noção
Reply
Reinaldo Coral Reply:
setembro 4th, 2009 at 18:54
Cara… agora entendi o que você quer.
Muito simples.
Supondo que seu intervalo de números desordenados seja das colunas A até E, coloque a seguinte fórmula para calcular de acordo com os algarismos desejados:
Na coluna para mostrar os totais para o algarismo 0:
=CONT.SE($A1:$E1;0)
Na coluna para mostrar os totais para o algarismo 1:
=CONT.SE($A1:$E1;1)
Na coluna para mostrar os totais para o algarismo 2:
=CONT.SE($A1:$E1;2)
Na coluna para mostrar os totais para o algarismo 3:
=CONT.SE($A1:$E1;3)
E assim por diante até o algarismo 9, sempre substituindo o número em negrito pelo número que deseja contar.
Depois copie a fórmula para as linhas seguintes.
Espero que tenha ajudado.
Abçs
Reply
VALEU OBRIGADO
Reply
Gostaria de saber com mais detalhes como crio o modulo, onde chego la , e depois de colar oque faço. Desde ja agradeço.
Reply
Reinaldo Coral Reply:
outubro 17th, 2009 at 13:48
Vou postar um artigo explicando alguns detalhes básicos para o desenvolvimento no Project VBA, ok.
Abraços
Reply
E para usar no Br office calc?
Reply
Reinaldo Coral Reply:
outubro 17th, 2009 at 13:33
Pow cara… vou ficar devendo essa!!! Não uso o Br Office.
Reply
Como se estreve 3.798,60 e tambem esses aqui > 972,20 E >1.462,00…
Obrigada :D
Se for posivel para vcs por favor me mandem a resposta ainda hoje :)
Eu fiaria bastante feliz se isso acontecese ;)
Obrigada pela atenção de vcs e tenham uma boa noite de sono … :D
By:Nathália gabriela martins de lima ;)
Reply
Reinaldo Coral Reply:
abril 6th, 2010 at 22:11
Olá Nathalia,
Baixe o arquivo de exemplo que está disponível no final deste artigo e utilize para transcrever qualquer valor para extenso.
Abraço
Reply
Olá, parabéns pelo site, BEM interessante!
Será que você poderia me ajudar com um projeto meu? Quero fazer uma planilha no excel que seja como um módulo de geração de orçamentos, e gostaria que o excel gerasse um número cada vez que eu abrisse a planilha(sem ser número aleatório, deve ser crescente, tipo, orçamento 1,2,3…) existe alguma fórmula que faça isso?
Atte,
Perin
Reply
Reinaldo Coral Reply:
maio 21st, 2010 at 13:23
Luis, não existe fórmula pronta para isso, mas você pode fazer o seguinte. Armazenar o último número de orçamento gerado em uma célula especifica, de preferência numa planilha específica também e fazer referência a esta célula no momento da geração do novo orçamento. Sempre que a macro buscar este número, ele será incrementado em uma unidade para ser usado na próxima geração de novo orçamento.
Reply
Preciso saber como converte um numero 1234567890122 em um código contábil 1.2.3.4.5.6.7.8.9.0.1.22?
Reply
Reinaldo Coral Reply:
maio 29th, 2010 at 17:58
Manoel,
Caso o padrão de seu código seja constante como no exemplo que você me pergunta, ou seja, 13 dígitos, separados por ponto (.) , um a um, exceto os dois últimos, você pode formatar a célula de maneira personalizada assim:
Selecione as células desejadas;
Tecle CTRL+1, para acessar a tela Formatar;
Na aba Número, selecione a categoria Personalizado;
E digite no campo Tipo: 0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.00
Espero ter ajudado.
Abraço
Reply
Olá amigo,
Boa tarde!
Achei muito interessante a sua página, e através do seu conhecimento gostaria de lhe pedir uma ajuda.
Tem como dismembrar um numero de uma célula, por exemplo;
O numero 306604 na celula B3, e utilizando alguma fórmula para desmembrá-lo nas demais celulas (C3=3,D3=0,E3=6,F3=6,G3=0,H3=4)?
Muito obrigado pela atenção.
Reply
Reinaldo Coral Reply:
julho 2nd, 2010 at 17:48
Jonas,
Digite a fórmula abaixo na célula C3 e arraste-a para as células adjacentes.
=EXT.TEXTO(TEXTO($B3;”@”);COL()-COL($B3);1)
Abraço.
Reply