Limitar caracteres de un textbox. Solo números y decimales

Me gustaría limitar los caracteres de 1textbox pero no logro hacerlo bien.

Necesitaría que el textbox TOTAL_PAGADO solo aceptara números y 1 coma. Además por delante de la coma como máximo debe haber 6 números y detrás de la coma 2.

Private Sub total_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii > Asc("9") Or KeyAscii < Asc("0") Then
        If KeyAscii = Asc("-") Then
            If InStr(1, Me.total.Text, "-") > 0 Or _
               Me.total.SelStart > 0 Then KeyAscii = 0
        ElseIf KeyAscii = Asc(",") Then
            If InStr(1, Me.total.Text, ".") > 0 Then KeyAscii = 0
        Else
            KeyAscii = 0
        End If
    End If
End Sub

Aqui esta mi macro deja solo introducir solo numeros. Pero no hay la limitacion por delante de la coma ni por detras. Ademas me gustaria que el punto fuera el indicador de la separacion de los decimales. 

Me gustaría que se pudiera introducir los números decimales solo con el teclado numero de la derecha del teclado. Me gustaría que al pulsar el . Situado al lado del enter actuara como un separador decimal.

¿Qué estoy haciendo mal?

Respuesta
1

Hello Pol,

En Excel no hay mascaras, buuuuh :(

Así que para hacer lo que pides hay que "codearlo" ja.

Para permitir solo números y coma, el código es bastante sencillo, estuviste cerca, pero se puede acortar:

Private Sub total_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 44) Then
    KeyAscii = 0
End If
End Sub

taran!

Ahora, para validar el resto de condiciones, debe ser en el evento Exit del TextBox básicamente hay que comprobar 3 cosas (+1 extra que agregue yo, no dices nada al respecto), por lo que lo hace lucir largo, pero es muy simple.

1- ¿Cuántas comas hay?

2- ¿Cuántos dígitos antes de la coma?

3- ¿Cuántos dígitos después de la coma?

¿4(Bonus)- Y si no hay coma? Comprobare que no sean mas de 6 dígitos.

Bien, este código responde esas preguntas:

Private Sub total_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim chkFormat() As String
Dim comas As Integer
chkFormat() = Split(total.Value, ",")
comas = UBound(chkFormat)
'comprobar que no hay mas de una coma
If comas > 1 Then
    MsgBox "Solo se permite una coma.", vbExclamation, "Error..."
    total.Value = vbNullString
Cancel = True
Exit Sub
End If
Debug.Print comas
'comprobar cantidad de digitos
If comas > 0 Then
    'antes de la coma
    If Len(chkFormat(0)) > 6 Then
        MsgBox "No se permiten mas de 6 digitos antes de la coma.", vbExclamation, "Error..."
        total.Value = vbNullString
    Cancel = True
    Exit Sub
    End If
    'despues de la coma
    If Len(chkFormat(1)) > 2 Then
        MsgBox "No se permiten mas de 2 digitos despues de la coma.", vbExclamation, "Error..."
        total.Value = vbNullString
    Cancel = True
    End If
Else
    If Len(Me.TextBox1.Value) > 6 Then
        MsgBox "No se permiten mas de 6 digitos.", vbExclamation, "Error..."
        total.Value = vbNullString
    Cancel = True
    End If
End If
End Sub

Andy

La linea que dice "Debug.Print comas" la puedes borrar, la tenia para hacer mis pruebas. Se me escapó cuando te copie el código :P

1 respuesta más de otro experto

Respuesta
1

¿Tienes qué hacerlo por código?

Si usas las propiedades del cuadro de texto (o del campo en la tabla) para establecer el formato, lo solucionas sin mayor dificultad:

En "Máscara de entrada" le pones: ######,## y ya lo tienes, solo te dejará escribir 6 dígitos antes de la coma y dos después, y como la coma ya te la pone por defecto, ni la tienes que escribir.

PD: la solución que te ofrezco es para Access

Un saludo.


El problema es que es que estoy programando un form con vba en excel y ha de ser por código. Muchas gracias igualmente

Pues si lo quieres hacer en Excel, no tiene sentido que cuelgues también pregunta el foro de Access, porque te responderán también pensando en ese programa.

De todas formas, ¿en el formulario de no puedes configurar una máscara de entrada en los textbox (es algo que desconozco)? Si la respuesta es afirmativa, mi solución es perfectamente válida.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas