Limitar entrada a dos decimales
Resuelto
Hellodie45
-
SANA -
SANA -
Hola,
Soy principiante en VBA Excel y busco limitar la entrada de un usuario en un textbox (en un userform) para que solo pueda introducir un número decimal con, como máximo, dos cifras después de la coma.
¿Es posible bloquear la entrada cuando el usuario introduce más de dos cifras después de la coma?
No quiero solo mostrar un mensaje de advertencia al usuario, sino realmente bloquear la entrada después de dos cifras después de la coma.
No sé si esto se puede hacer en VBA Excel.
Por el momento, he logrado hacer que en mi textbox solo se acepte el formato numérico y la aceptación de un separador decimal con la posibilidad de introducir una coma o un punto, que se transformará automáticamente en coma.
Otra pequeña pregunta: ¿cómo puedo transformar mi columna de Excel con los valores introducidos por el textbox (por lo tanto en formato texto) a formato número?
Gracias de antemano por su ayuda.
Que tengan un buen día.
Hellodie45
Configuración: Windows XP / Internet Explorer 6.0 / Excel 2003
Soy principiante en VBA Excel y busco limitar la entrada de un usuario en un textbox (en un userform) para que solo pueda introducir un número decimal con, como máximo, dos cifras después de la coma.
¿Es posible bloquear la entrada cuando el usuario introduce más de dos cifras después de la coma?
No quiero solo mostrar un mensaje de advertencia al usuario, sino realmente bloquear la entrada después de dos cifras después de la coma.
No sé si esto se puede hacer en VBA Excel.
Por el momento, he logrado hacer que en mi textbox solo se acepte el formato numérico y la aceptación de un separador decimal con la posibilidad de introducir una coma o un punto, que se transformará automáticamente en coma.
Otra pequeña pregunta: ¿cómo puedo transformar mi columna de Excel con los valores introducidos por el textbox (por lo tanto en formato texto) a formato número?
Gracias de antemano por su ayuda.
Que tengan un buen día.
Hellodie45
Configuración: Windows XP / Internet Explorer 6.0 / Excel 2003
3 respuestas
-
Hola,
Pregunta 1: limitar la entrada a 2 números después de la coma:
Usando el evento "TextBox_Change" Así:Private Sub TextBox1_Change() If Right(TextBox1, 1) = "." Or Right(TextBox1, 1) = "," Then TextBox1.MaxLength = Len(TextBox1) + 2 End Sub
Pregunta 2: Transformar el valor del TextBox de String a "número": Aquí, dado que hablamos de números decimales, vamos a transformar el "String" del TextBox en "Double". Al escribir en la celda, en lugar de un simple: Cells(1, 1) = TextBox1 añadimos CDbl:Cells(1, 1).Value = CDbl(TextBox1)
--
Atentamente,
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema? ---
gracias por tus respuestas.
la pregunta 2 está resuelta (he buscado de manera demasiado complicada) y era muy sencilla cuando conoces todas las funciones de VBA. ¡Muchas gracias!
sin embargo, para la pregunta 1: funciona parcialmente porque cuando ingreso un número decimal con más de dos cifras después de la coma, se bloquea y no muestra lo que sigue (que es lo que busco), pero cuando deseo borrar lo que acabo de ingresar y pongo un número entero (un poco largo), también se bloquea.
aquí tienes un ejemplo:
quiero ingresar 1,235 y la entrada se bloquea en 1,23 (genial, es lo que quiero), pero cuando borro 1,23 y quiero poner 123456, solo puedo ingresar 1234.
¿ves de dónde viene el problema?
una vez más, gracias por tus respuestas ... -
Sí, veo bien de dónde viene el problema. De hecho, cuando borras el contenido del TextBox, su "MaxLength" se queda bloqueado en el valor que le acabamos de asignar. Por lo tanto, hay que decirle a la macro: Si el número de caracteres en el TextBox es igual a 0, entonces "devuelves el MaxLength a 255". O sea:
Private Sub TextBox1_Change() If Len(TextBox1) = 0 Then TextBox1.MaxLength = 255 If Right(TextBox1, 1) = "." Or Right(TextBox1, 1) = "," Then TextBox1.MaxLength = Len(TextBox1) + 2 End Sub
-
¡Genial, funciona!
¡Muchas gracias por tu ayuda!
Última pequeña pregunta: cuando tengo varios cuadros de texto en un mismo formulario con el mismo tipo de problema: bloqueo de la entrada a un decimal con más de dos cifras después de la coma, ¿cómo debo hacer para evitar copiar y pegar el código 25 veces?
... gracias de nuevo. -
-
-
-
Hola,
Puedes intentar truncar el número ingresado. Por ejemplo, si el usuario ingresa 12.13264, cuando el cuadro de texto ya no está seleccionado, este número se convierte en 12.13
Para truncar, necesitas crear una función que haga eso. Hay varias maneras de proceder.
Por ejemplo, número = int(número * 10^2)/10^2 para obtener dos cifras después de la coma.
A poner en un evento: TextBox1_Salida
--
C. Taha-
gracias por tu respuesta, pero quiero saber si se puede bloquear la entrada a dos dígitos después de la coma (por ejemplo, con un messagebox para advertir al usuario que está ingresando de más).
si esto no es posible, ya había considerado esta solución que hace responsable bastante al usuario (lo que intento evitar al máximo).
pero gracias de nuevo ... -
-
-
-
Te propongo esta solución también:
Private Sub TextBox1_Change()
If InStr(1, Replace(TextBox1.Text, ",", "."), ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End Sub
Resta saber si el separador de decimales en tu sistema es "." o ",". Para mí es el punto ".". Debes adaptar según el caso, o bien mejorar para tener en cuenta ambas cosas.
--
C. Taha-
-
muchas gracias por preocuparte por mí.
la solución que me dio pijaku funciona y me parece un poco más clara. pero si consideras que tu solución es más efectiva, la adoptarè sin problema.
además, ¿crees que tienes una solución para evitar copiar y pegar 25 veces (según pijaku, no hay una)? porque me desespera tener que hacerlo! jaja
gracias de nuevo ... -
Hola
1 - Por el momento, puedes definir un solo método para todos los textbox del UserForm
Private Sub TextBox1_Change()
test Me.ActiveControl
End Sub
Private Sub test(txtObj As Object)
If Len(txtObj) = 0 Then txtObj.MaxLength = 255
If Right(txtObj, 1) = "." Or Right(txtObj, 1) = "," Then txtObj.MaxLength = Len(txtObj) + 2
End Sub
Usar con precaución. Hay que verificar que realmente todos los TextBox tengan la misma función en tu formulario.
2 - De lo contrario, la solución de pijaku es astuta. Pero tiene un pequeño defecto:
Cuando escribes "1253.24", es cierto, bloquea los decimales. Sin embargo, no se puede modificar la parte entera bajo esta escritura. No se puede agregar, por ejemplo, un dígito al principio como "91253.25" sin haber borrado primero un dígito decimal. La solución que he propuesto tiene en cuenta este comentario. -
Para el primer problema, intentaré encontrar una solución para reducir mi código y optimizarlo. Gracias por tu solución.
Para el segundo, tienes toda la razón, no se pueden añadir cifras después de haber superado los dos decimales. Pero probé tu código y no funciona (quizás fue un error de mi parte...). Pero bueno, al final no es tan grave, el usuario podrá borrar y reescribir.
Gracias por tu ayuda, cómocamarchaeya.
-