Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Impedir Digitação Após a Vírgula [RESOLVIDO]

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
pedrobb
Colaborador
Colaborador
Mensagens: 74
Registrado em: Qua Jul 25, 2012 12:42 pm
Localização: Montes Claros-MG

Impedir Digitação Após a Vírgula [RESOLVIDO]

Mensagem por pedrobb »

Pessoal,
Em uma Caixa de Texto (TextBox) que aceita apenas Números e 01 vírgula, preciso impedir a Digitação após a Segunda Casa decimal.
Exemplo: 123,55 (correto - 2 casas) 123,558 (errado - 3 casas)
Grato,
Pedro


Obs: post também em http://www.planilhando.com.br/forum/vie ... 20&t=32299
Editado pela última vez por pedrobb em Qua Dez 11, 2019 8:17 pm, em um total de 1 vez.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Basole
Colaborador
Colaborador
Mensagens: 67
Registrado em: Qua Mar 20, 2013 6:31 pm

Re: Impedir Digitação Após a Vírgula

Mensagem por Basole »

Veja se a sugestao lhe atende:

No evento change, do seu textbox

Código: Selecionar todos

Private Sub TextBox1_Change()
   
   formataMoeda TextBox1
   
End Sub
Em um modulo padrao, (desta forma voce pode usar para outros controles), cole o codigo abaixo

Código: Selecionar todos

Sub formataMoeda(valor)
   
    If IsNumeric(valor) Then
        If InStr(1, valor, "-") >= 1 Then valor = Replace(valor, "-", "") 'retira sinal negativo
        If InStr(1, valor, ",") >= 1 Then valor = CDbl(Replace(valor, ",", "")) 'retirar a virgula
        If InStr(1, valor, ".") >= 1 Then valor = Replace(valor, ".", "") 'para trabalhar melhor retiramos ponto
        Select Case Len(valor) 'verifica casas para inserção de ponto
            Case 1
            numPonto = "00" & valor
            Case 2
            numPonto = "0" & valor
            Case 6 To 8
            numPonto = Left(valor, Len(valor) - 5) & "." & Right(valor, 5)
            Case 9 To 11
            numPonto = inseriPonto(8, valor)
            Case 12 To 14
            numPonto = inseriPonto(11, valor)
            Case Else
            numPonto = valor
        End Select
        numVirgula = Left(numPonto, Len(numPonto) - 2) & "," & Right(numPonto, 2)
        TextBox1.Value = numVirgula
    Else
        If valor = "" Then Exit Sub
        MsgBox "Número invalido", vbCritical, "Caracter Invalido"
        Exit Sub
    End If
End Sub
 
 
Function inseriPonto(inicio, valor)
    I = Left(valor, Len(valor) - inicio)
    M1 = Left(Right(valor, inicio), 3)
    M2 = Left(Right(valor, 8), 3)
    F = Right(valor, 5)
    If (M2 = M1) And (Len(valor) < 12) Then
    inseriPonto = I & "." & M1 & "." & F
    Else
    inseriPonto = I & "." & M1 & "." & M2 & "." & F
    End If
End Function
fonte: http://excelevba.com.br/formato-moeda-n ... to-digita/


pedrobb
Colaborador
Colaborador
Mensagens: 74
Registrado em: Qua Jul 25, 2012 12:42 pm
Localização: Montes Claros-MG

Re: Impedir Digitação Após a Vírgula

Mensagem por pedrobb »

Basole,
Obrigado pela atenção.
A função é interessante, mas ainda não é o que quero.
Uso a função abaixo no KeyPress. Falta apenas Impedir qualquer digitação após a Vírgula:

Código: Selecionar todos

Private Sub TxtValor_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 44, 8, 48 To 57
If KeyAscii = 44 Then If InStr(1, TxtValor, ",", vbTextCompare) > 0 Then KeyAscii = 0
Case Else
KeyAscii = 0
End Select
End Sub


Basole
Colaborador
Colaborador
Mensagens: 67
Registrado em: Qua Mar 20, 2013 6:31 pm

Re: Impedir Digitação Após a Vírgula

Mensagem por Basole »

pedrobb escreveu: Ter Dez 10, 2019 10:24 am Exemplo: 123,55 (correto - 2 casas) 123,558 (errado - 3 casas)
Bom pelo que entendi, conforme seu primeiro post que o usuário consiga inserir apenas 2 números apos a virgula:
Mantenha o seu evento keyPress e acrescente o evento Change:

Código: Selecionar todos


Private Sub TxtValor_Change()
Dim bMax As Byte

   bMax = VBA.Len(TxtValor.Value)

    If VBA.InStr(1, TxtValor.Value, ".", vbTextCompare) > 0 Or _
       VBA.InStr(1, TxtValor.Value, ",", vbTextCompare) > 0 Then
    
        If TxtValor.MaxLength = bMax + 1 Or TxtValor.MaxLength = bMax Then
    
        Else
        
            TxtValor.MaxLength = bMax + 2
    
        End If
    
    Else
         TxtValor.MaxLength = 0
    End If

End Sub



Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


pedrobb
Colaborador
Colaborador
Mensagens: 74
Registrado em: Qua Jul 25, 2012 12:42 pm
Localização: Montes Claros-MG

Re: Impedir Digitação Após a Vírgula

Mensagem por pedrobb »

Basole,
Perfeito. Incrível.
Muito Obrigado!!!!!!!!!!!!!!


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder