3 de maio de 2011

CODIGO PARA VALOR EM EXTENSO

Function Extenso(nValor)
'
'escreve o valor em Reais por extenso
'
'

'Faz a validação do argumento
If IsNull(nValor) Or nValor <= 0 Or nValor > 9999999.99 Then
Exit Function
End If

'Declara as variáveis da função
Dim nContador, nTamanho As Integer
Dim cValor, cParte, cFinal As String
ReDim aGrupo(4), aTexto(4) As String

'Define matrizes com extensos parciais
ReDim aUnid(19) As String
aUnid(1) = "Um ": aUnid(2) = "Dois ": aUnid(3) = "Três "
aUnid(4) = "Quatro ": aUnid(5) = "Cinco ": aUnid(6) = "Seis "
aUnid(7) = "Sete ": aUnid(8) = "Oito ": aUnid(9) = "Nove "
aUnid(10) = "Dez ": aUnid(11) = "Onze ": aUnid(12) = "Doze "
aUnid(13) = "Treze ": aUnid(14) = "Quatorze ": aUnid(15) = "Quinze "
aUnid(16) = "Dezesseis ": aUnid(17) = "Dezessete ": aUnid(18) = "Dezoito "
aUnid(19) = "Dezenove "

ReDim aDezena(9) As String
aDezena(1) = "Dez ": aDezena(2) = "Vinte ": aDezena(3) = "Trinta "
aDezena(4) = "Quarenta ": aDezena(5) = "Cinqüenta "
aDezena(6) = "Sessenta ": aDezena(7) = "Setenta ": aDezena(8) = "Oitenta "
aDezena(9) = "Noventa "

ReDim aCentena(9) As String
aCentena(1) = "Cento ": aCentena(2) = "Duzentos "
aCentena(3) = "Trezentos ": aCentena(4) = "Quatrocentos "
aCentena(5) = "Quinhentos ": aCentena(6) = "Seiscentos "
aCentena(7) = "Setecentos ": aCentena(8) = "Oitocentos "
aCentena(9) = "Novecentos "

'Divide o valor em vários grupos
cValor = Format$(nValor, "0000000000.00")
aGrupo(1) = Mid$(cValor, 2, 3)
aGrupo(2) = Mid$(cValor, 5, 3)
aGrupo(3) = Mid$(cValor, 8, 3)
aGrupo(4) = "0" + Mid$(cValor, 12, 2)

'Processa cada grupo
For nContador = 1 To 4
cParte = aGrupo(nContador)
nTamanho = Switch(Val(cParte) < 10, 1, Val(cParte) < 100, 2, Val(cParte) < 1000, 3) If nTamanho = 3 Then If Right$(cParte, 2) <> "00" Then
aTexto(nContador) = aTexto(nContador) + aCentena(Left(cParte, 1)) + "e "
nTamanho = 2
Else
aTexto(nContador) = aTexto(nContador) + IIf(Left$(cParte, 1) = "1", "Cem ", aCentena(Left(cParte, 1)))
End If
End If
If nTamanho = 2 Then
If Val(Right(cParte, 2)) < 20 Then aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 2)) Else: aTexto(nContador) = aTexto(nContador) + aDezena(Mid(cParte, 2, 1)) If Right$(cParte, 1) <> "0" Then
aTexto(nContador) = aTexto(nContador) + "e "
nTamanho = 1
End If
End If
End If
If nTamanho = 1 Then
aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 1))
End If
Next

'Gera o formato final do texto
If Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 0 And Val(aGrupo(4)) <> 0 Then
cFinal = aTexto(4) + IIf(Val(aGrupo(4)) = 1, "Centavo", "Centavos")
Else
cFinal = ""
cFinal = cFinal + IIf(Val(aGrupo(1)) <> 0, aTexto(1) + IIf(Val(aGrupo(1)) > 1, "Milhões ", "Milhão "), "")
If Val(aGrupo(2) + aGrupo(3)) = 0 Then
cFinal = cFinal + "De "
Else
cFinal = cFinal + IIf(Val(aGrupo(2)) <> 0, aTexto(2) + "Mil ", "")
End If
cFinal = cFinal + aTexto(3) + IIf(Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 1, "Real", "Reais ")
cFinal = cFinal + IIf(Val(aGrupo(4)) <> 0, "e " + aTexto(4) + IIf(Val(aGrupo(4)) = 1, "Centavo", "Centavos"), "")
End If
Extenso = cFinal

End Function

20 comentários:

OBRIGADO PELA DICA! FAZIA TEMPOS QUE ESTAVA BUSCANDO ISTO NA INTERNET MAS NÃO ENCONTRAVA, OBRIGADO. SÓ UMA DÚVIDA, SE O VALOR EXTENSO FOR MUITO GRANDE, TIPO: 1.547.659,99 O EXTENSO FICARIA MUITO COMPRIDO, ENTÃO COMO FARIA PARA COLOCAR EM DUAS LINHAS, OU DENTRO DE UMA CÉLULA MESCLADA? TEM COMO LIMITAR O NÚMERO DE CARACTERES EM UMA LINHA, JOGANDO O EXCEDENTE PARA OUTRA?

olá. Gostei muito de sua aula, mas não funcionou direito na minha máquina. Você pode me ajudar? Na célula onde deveria entrar o extenso, entra #NOME?. Como eu corrijo isso? obrigada. Gostaria, também de saber como quebrar a linha, assim como o Moacir perguntou.

Estou tendo problemas, pois quando digito um valor acima de 100 mil ele não dar o valor correto.

Marcos, boa tarde !!!

Você poderia informar o código para vba de uma palanilha que não está aceitando itens no cadastro e apagar do demostrativo.

Att,
João

Este comentário foi removido pelo autor.

Olá Marcos!
Estou tendo o mesmo problema da Cecília, fiz tdo certinho como ensina, salvo e tdo certo, mais quando vou abrir novamente, dá esse #NOME?. Será que tem como resolver?
Att,

Odetto Junior.

Meu fí deutudo certinhoooo. vlw...me ajudou muitão..........

Luiz Carlos

é uma mão na roda, valeu Marcos, funcionou direitinho!

PARABÉNS PELO TRABALHO DESEJO SUCESSO NA CARREIRA GRANDE ABRAÇO

boa tarde só estou com um problema
Quando tento salvar as configurações aparece essa mensagem

Os recursos a seguir não podem ser salvos em pasta de trabalho sem macro:
-Projeto do VB
Para salvar um arquivo com esses recurso,Clique em Não e escolha um tipo de arquivo habilitado para macro na lista Tipo de arquivo

Faço o procedimento tento todas elas mas não tenho nehum arquivo habilitado instalado no PC.
Pode me ajudar?
Abraço

Todas as vezes que quero salvar não dá certo, tenho que entrar com o código de novo. Como faço para salvar?

PRIMEIRAMENTE AGRADEÇO ... O PROBLEMA NA VERDADE SERIA A Extensão DE ARQUIVO QUE VOCÊ SALVOU O SEU PROJETO, NAS VERSÕES 2007 E 2010 DO EXCEL PARA QUE conteúdos QUE CONTENHAM MACROS OU Códigos, SERÁ necessário SALVAR EM UMA EXTENSÃO DE ARQUIVO QUE RECONHEÇA ESSE TIPO DE CONTEÚDO, EXITEM DUAS (.XLS OU .XLSM).

Marquinho, ao clicar em depurar e compilar VBAProject, aparece o seguinte erro: Era esperado End Function. O que faço? Em que parte do texto acrescento "End Function"?

Deus abençoe o seu trabalho. Consegui aplicar a fórmula!

Deus abençoe o seu trabalho. Que você continue passando seus conhecimento.


Grato!

Muito obrigado
Por você liberar este código
Me ajudou de mais

Esse código chegou em boa hora. Valeu Amigão.

Você não imagina o quanto me ajudou! Deus lhe ilumine!

É um ótimo código, só que para valores acima de 10 Milhões ele não funciona, teria como alterar o Function Extenso(nValor) para valores maiores.
Um grande abraço e muito obrigado.

Postar um comentário