APROVEITE, MELHORE OU COMENTE
A função VAL transforma uma string em valor, certo?
Nem sempre. Se o seu string estiver formatado e contiver um valor superior a 999 o resultado estará errado. Se, por exemplo, seu string contiver 1.200,50 VAL resultará em [s30] 1,20.
Para resolver essa questão , criei a função abaixo - que tem ao menos um defeito: presume que a formatação esteja em "português", ou seja com a vÃrgula separando inteiros de decimais. Mas é absolutamente útil para quem tem certeza (é o meu caso) de estar trabalhando apenas em "portugês".
Se esse for o seu caso também, pode copiar [s92] e tirar bom proveito.
Agora, se você tiver uma rotina melhor, ou simplesmente uma boa idéia para otimizá-la - TODOS agradeceremos.
[s25] Comente à  vontade.
Nem sempre. Se o seu string estiver formatado e contiver um valor superior a 999 o resultado estará errado. Se, por exemplo, seu string contiver 1.200,50 VAL resultará em [s30] 1,20.
Para resolver essa questão , criei a função abaixo - que tem ao menos um defeito: presume que a formatação esteja em "português", ou seja com a vÃrgula separando inteiros de decimais. Mas é absolutamente útil para quem tem certeza (é o meu caso) de estar trabalhando apenas em "portugês".
Se esse for o seu caso também, pode copiar [s92] e tirar bom proveito.
Agora, se você tiver uma rotina melhor, ou simplesmente uma boa idéia para otimizá-la - TODOS agradeceremos.
Public Function ValorTxt(xTxt) As Double
Dim xText
Dim xN
For xN = 1 To Len(xTxt)
If Mid$(xTxt, xN, 1) <> "." and Mid$(xTxt, xN, 1) <> "," Then
xText = xText + Mid$(xTxt, xN, 1)
ElseIf Mid$(xTxt, xN, 1) = "," Then
xText = xText + "."
End If
Next
ValorTxt = Val(xText)
End Function
[s25] Comente à  vontade.
a rotina é meio pancada, mas, funcionou!
Private Sub Command1_Click()
Dim varTexto As String
varTexto = "1.200,50"
resultado = StringToDouble(varTexto)
MsgBox "R$ " & Format(resultado, "0.00")
End Sub
Private Function StringToDouble(xTxt As String) As Double
Dim xTxt2 As String
xTxt2 = ""
For pesquisa = 1 To Len(xTxt)
If Mid(xTxt, pesquisa, 1) = "," Then Exit For
If Mid(xTxt, pesquisa, 1) <> "." Then
xTxt2 = xTxt2 + Mid(xTxt, pesquisa, 1)
End If
Next pesquisa
xTxt2 = xTxt2 + "."
For pesquisa2 = (pesquisa + 1) To Len(xTxt)
xTxt2 = xTxt2 + Mid(xTxt, pesquisa2, 1)
Next pesquisa2
StringToDouble = Val(xTxt2)
End Function
Pq não postar tal função na seção de dicas?? ou códigos fontes??
Anibal,
Será que precisa mesmo dessa rotina? Não seria mais fácil usar:
Claro que se vc não quer digitar essa linha grande de comandos, colocar em função:
[/c]
é só uma sugestão, não crÃtica
Será que precisa mesmo dessa rotina? Não seria mais fácil usar:
valTxt = Val(Replace(Replace(CStr("1.200,50"), ".", ""), ",", "."))
Claro que se vc não quer digitar essa linha grande de comandos, colocar em função:
[c]Function funValTxt(ByVal strNumero As String) As Double
funValTxt = Val(Replace(Replace(CStr(strNumero), ".", ""), ",", "."))
End Function
[/c]
é só uma sugestão, não crÃtica
Tá louco heim PASTOR! KKKKKK
Citação:ANDREMILARE escreveu:
Tá louco heim PASTOR! KKKKKK
é a idade!
Citação:ANDREMILARE escreveu:
Anibal,
Será que precisa mesmo dessa rotina? Não seria mais fácil usar:
valTxt = Val(Replace(Replace(CStr([Ãâ€ÂÂ]1.200,50[Ãâ€ÂÂ]), [Ãâ€ÂÂ].[Ãâ€ÂÂ], [Ãâ€ÂÂ][Ãâ€ÂÂ]), [Ãâ€ÂÂ],[Ãâ€ÂÂ], [Ãâ€ÂÂ].[Ãâ€ÂÂ]))
Claro que se vc não quer digitar essa linha grande de comandos, colocar em função:
[c]Function funValTxt(ByVal strNumero As String) As Double
funValTxt = Val(Replace(Replace(CStr(strNumero), [Ãâ€ÂÂ].[Ãâ€ÂÂ], [Ãâ€ÂÂ][Ãâ€ÂÂ]), [Ãâ€ÂÂ],[Ãâ€ÂÂ], [Ãâ€ÂÂ].[Ãâ€ÂÂ]))
End Function
[/c]
é só uma sugestão, não crÃtica
Poderia ser uma crÃtica - sem problemas. Principalmente se fosse construtiva.
Botei aqui pra isso mesmo. E, quem sabe, sair com uma função melhor.
Com isso, respondo também ao Marcelo - quando tiver certeza de ter chegado ao ponto ótimo, postarei em DICAS.
Voltando ao ANDRé - sua dica é Ó“TIMA! Pena que o VB5 não tem replace.
Já é a milésima vez que postamos juntos... KKKK
Meu comentário não foi pela rotina, mas pela hora do post...[S68]
Meu comentário não foi pela rotina, mas pela hora do post...[S68]
Citação:Com isso, respondo também ao Marcelo - quando tiver certeza de ter chegado ao ponto ótimo, postarei em DICAS.
Blz!!
Foi só uma sugestão!!
ok!
Citação:ANDREMILARE escreveu:
Já é a milésima vez que postamos juntos... KKKK
Meu comentário não foi pela rotina, mas pela hora do post...[S68]
Ok ANDREMILARE,
mas, de qualquer forma faltam 4 meses pros 40!!
aaiii!!!
Citação:MARCELOHF escreveu:
...
Foi só uma sugestão!!
E a sugestão foi muito BEM VINDA. Inclusive por isso, ela mereceu uma explicação.
Tópico encerrado , respostas não são mais permitidas