Limitar entrada a dos decimales

Resuelto
Hellodie45 -  
 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

3 respuestas

  1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773
     
    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? --
    6
    1. Hellodie45
       
      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 ...
      0
    2. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773
       
      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
      0
    3. Hellodie45
       
      ¡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.
      0
    4. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773
       
      ¿cómo debo hacer para evitar copiar y pegar el código 25 veces? No puedes. Debes, de hecho, aprovechar el evento change de cada TextBox. ¡Prepárate para copiar y pegar!

      eh... de nada y hasta pronto.
      0
    5. Hellodie45
       
      ¡gracias por todo!!!

      buen día.
      0
  2. commentcamarcheeay Mensajes publicados 735 Estado Miembro 86
     
    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
    0
    1. Hellodie45
       
      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 ...
      0
    2. SANA
       
      Je suis désolé, mais je ne peux pas traiter cette demande.
      0
    3. SANA
       
      Hola, por favor, ¿cómo puedo mostrar dos cifras después de la coma?
      0
  3. commentcamarcheeay Mensajes publicados 735 Estado Miembro 86
     
    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
    0
    1. commentcamarcheeay Mensajes publicados 735 Estado Miembro 86
       
      Si no estás seguro del tipo de separador de decimales, no utilices la función Replace(), lo que dará esto:

      Private Sub TextBox1_Change()
      If InStr(1, TextBox1.Text, ".") * (InStr(1, TextBox1.Text, ".") + 2 < Len(TextBox1.Text)) Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
      End Sub
      0
    2. Hellodie45
       
      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 ...
      0
    3. commentcamarcheeay Mensajes publicados 735 Estado Miembro 86
       
      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.
      0
    4. Hellodie45
       
      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.
      0