6 febrero, 2025

MACRO PARA VALIDAR DATOS NÚMERICOS EN UN TEXTBOX

Cuando trabajamos con userform y tenemos que introducir datos a través de un textbox, muchas veces nos encontramos con el problema de como condicionar que el usuario ingrese un tipo de dato concreto y en caso de no hacerlo que el programa no grabe los datos.

Pues bien, os ofrezco una sencilla macro para condicionar este tipo de tarea. Una vez colocada la instrucción en vuestro editor de VBA y visualicéis el userform y el textbox, al introducir cualquier carácter que no sea un número, aparecerá el mensaje «DEBES INTRODUCIR UN VALOR NÚMERICO» y el cuadro de texto se volverá de color rojo.

Private Sub TextBox1_Change()
validar = IsNumeric(TextBox1.Value)
If validar = False Then
MsgBox "DEBES INTRODUCIR UN VALOR NUMÉRICO"
TextBox1.BackColor = &HFF8&
End If
End Sub


La función realmente importante es Validar =IsNumeric (Textbox1. Value) que ofrece la posibilidad de realizar una validación como si estuviésemos trabajando en una hoja Excel con la validación de datos que todos conocemos.

Esta macro se complementa siempre con otra serie de instrucciones tales como:  grabar datos en una hoja de Excel a través de un userform, limpiar datos de un textbox después de grabar datos y muchas otras que ya iré explicando en entradas sucesivas.

Espero que os sea de utilidad.
Saludos 🙂

Comparte este post

20 comentarios en «MACRO PARA VALIDAR DATOS NÚMERICOS EN UN TEXTBOX»

  1. Me ha sido de gran ayuda el ejemplo, pero en el caso de que sean mil números por validar, habría alguna manera de especificar un rango de números para no escribir de uno por uno.Mil gracias por la ayuda.Saludos,

  2. Buenas Anónimo;Pensé que solo era para ese caso concreto 🙂 No hay problema, con una pequeña modificación en el código funcionará sin problema:validarnumero = IsNumeric(TextBox1.Value) And TextBox1.Value >= 1 And TextBox1.Value <= 1000De esta forma, estamos condicionando que el dato a introducir sea numérico y que además esté entre los valores indicados, es decir, el 1 y el 1000 (ambos inclusive). Puedes modificar los tramos en función de tus necesidades.Te dejo enlace al nuevo ejemplo: https://drive.google.com/file/d/0B2MZVcPxjhyPTnYyVzR4V21xM3M/view?usp=sharing

  3. Hola buenas días, disculpen la molestia, pero estoy haciendo una matriz y dentro de los datos necesito validar el dni, que permita ingresar 8 dígitos y que sólo permita valores numéricos,estoy haciendo con validacion de datos,pero solo permite una condicion.

    1. Hola Carlalu:

      Sobre el tema de la validación del DNI, tengo un programa donde en varios formularios se valida el documento, está en esta entrada: https://excelsignum.wordpress.com/2014/10/12/gestion-de-clientes-con-excel/

      De todas formas te adjunto un ejemplo con una macro para poder validar los datos que comentas: 8 dígitos y que sean numéricos https://excelsignum.files.wordpress.com/2014/12/validar-datos-dni.xls
      Además también realiza la grabación del dato en caso de que cumpla la validación.

      A ver si te sirve el ejemplo. Un saludo y gracias por comentar.

  4. Hola, muy buena tu ayuda! Tengo una duda, y es la siguiente. Hago un código similar al tuyo, pero me salta un error. Te comento, hago lo siguiente:
    Dim es_numero As Boolean
    Dim Cantidad As Integer

    Cantidad = FormularioVenta.Cantidad.Value

    es_numero = WorksheetFunction.IsNumber(Cantidad)

    Y luego pregunto si es_numero es true o false. Funciona todo bien hasta el momento en el que lo que coloco en el textbox es un texto, entonces me salta un error diciendo que en el renglon de Cantidad = FormularioVeenta.Cantidad.Value , no coinciden los tipos.

    Te agradecería mucho si podes ayudarme!
    Gracias de antemano,
    Saludos!

  5. Hola Sebastián,
     
    Eso te sucede porque los datos que tienes en el Text en ese momento no son numéricos, y por lo tanto no coinciden los tipos. Por eso es más sencillo que trabajes con un condicional, si es numero haces la rutina, si no lo es (else) sales del proceso o muestras un mensaje. De esta forma controla el error.
     
    También lo puedes hacer con con On error GOTO y cuando se produzca el error muestras mensaje que solo se admiten datos numéricos. Creo que la primera opción es más sencilla, trabaja con un «if».
     
    Es lógica que te salga falso cuando introduces un texto en es_numero. Debes realizar un condicional.

    De todas formas, si quieres que lo vea en profundidad, enviame un ejemplo del form con el código y como quieres que se comporte. Saludos

    1. Hola Daniel:

      Solo tendrías que modificar los parámetros de la macro diciendo que valide solo cuando el dato NO es númerico:

      Private Sub TextBox1_Change()
      validar = Not IsNumeric(TextBox1.Value)
      If validar = False Then
      MsgBox "DEBES INTRODUCIR UN VALOR DE TEXTO"
      TextBox1.BackColor = &HFF8&
      End If
      End Sub

      Saludos.

  6. Hola Segu:

    Estoy trabajando en un formato para encontrar y modificar un registro en una tabla de Excel.

    Codigo Descripcion UM Tipo Costo Moneda Precioxmil Ti_e Cantidad Cavidades Ciclo Produccion_hora
    0000000001 CÓDIGO DE EJEMPLO PZ PT $4,000.25 MXP $54,784.20 0 0 24 16.4 5,268.29

    Ya puedo encontrar el registro, presentarlo en la pantalla y los campos que pueden modificarse.

    El problema es que desde que muestra los campos que deben ser numéricos el formato numérico no lo respeta y al actualizar el registro los
    no obtengo lo que se requiere:

    Codigo Descripcion UM Tipo Costo Moneda Precioxmil Ti_e Cantidad Cavidades Ciclo Produccion_hora
    1 CÓDIGO DE EJEMPLO PZ PT 4000,25 MXP 54784,2 0 0 24 16,4 526,829,268,292,683.00

    La manera de obtener los campos al seleccionar el registro es:

    ‘Actualizar el registro
    Private Sub ComBut_Modificar_Click()
    ‘ Obtener usuario
    Sheets(«Opciones»).Visible = True
    Sheets(«Opciones»).Select
    Range(«H4»).Select
    Usuario = ActiveCell.Value
    Sheets(«Articulos»).Visible = True
    Sheets(«Articulos»).Select
    Sheets(«Opciones»).Visible = False
    Fecha = Now()

    Continuar = MsgBox(«¿Actualizar el registro del artículo?», vbYesNo + vbExclamation, strTitulo)
    If Continuar = vbNo Then Exit Sub

    For i = 1 To 43
    ActiveCell.Offset(0, i – 1).Value = UCase(Me.Controls(«TextBox» & i).Value)
    Next i
    ActiveCell.Offset(0, 44 – 1).Value = Usuario
    ActiveCell.Offset(0, 45 – 1).Value = Fecha
    MsgBox «El Código Ha sido actualizado», vbExclamation, strTitulo
    Unload Me

    End Sub

    Y para actualizar el registro:


    ‘Llenar los cuadro de texto con los datos del registro elegido
    Private Sub UserForm_Initialize()
    For i = 1 To 45
    Me.Controls(«TextBox» & i).Value = ActiveCell.Offset(0, i – 1).Value
    Next i

    End Sub

    ¿Cómo puedo resolverlo?

    Gracias por tu ayuda y un buen día.

    1. Hola Francisco:

      Aunque debería ver el archivo para comprobar el funcionamiento. Creo que utilizando la función cdbl () lo podrías solucionar.

      Por ejemplo:

      Me.Controls(“TextBox” & i).Value = cdbl(ActiveCell.Offset(0, i – 1).Value)

      De todas formas, si puedes envíame el archivo y lo reviso.

      Saludos.


      1. ‘Llenar los cuadro de texto con los datos del registro elegido
        Private Sub UserForm_Initialize()

        TextBox1.Text = ActiveCell.Offset(0, 1 – 1).Text Para textos
        TextBox5.Text = Format(Val(ActiveCell.Offset(0, 5 – 1).Value), «$#,##0.00») Para números
        Adicionalmente en los TextBox que contienen números los alineé a la derecha.

        Para actualizar el registro;

        ‘Actualizar el registro
        Private Sub ComBut_Modificar_Click()

        ActiveCell.Offset(0, 1 – 1).Value = UCase(TextBox1.Text) Para textos
        ActiveCell.Offset(0, 5 – 1).Value = Format(Val(ActiveCell.Offset(0, 5 – 1).Value), «$#,##0.00») Para números.

        Funciona bien, el problema es que cuando hay texto que solo contienen números, la actualización en la celda los deja como números.

        Ejemplo si la celda contenía el texto 0000001 la actualización lo deja como número 1 y elimina los ceros anteriores, o si existía una etiqueta como 45678 la deja como número, si la información es alfanumérica no hay problema

        ¿Cómo puedo corregirlo?

        Después de resolverlo la siguiente pregunta es cómo incluyo en la forma controles combo para seleccionar valores predefinidos (ejemplo si o no, activo o no activo o una lista desplegable de valores) en vez de que sean introducidos manualmente.

        Finalmente ¿cómo puedo eliminar la opción de cerrar las formas con la cruz de la esquina superior derecha y solo se pueda hacer por botón de rutina de salida?

        Gracias por tu atención.

        1. Hola Francisco:

          Sobre estas preguntas que haces:

          1- tienes que tratar con condicionales, del tipo:

          validar = IsNumeric(TextBox1.Value)
          If validar = true Then
          textbox1.value= CStr(textbox1.Value)
          else
          textbox1.value=’aquí el formato de número que desees
          end if

          2- no entiendo la pregunta, pero si te refieres a cómo introduces valores en un combobox o listbox, tienes multitud de tutoriales en internet de cómo hacerlo, es muy sencillo y solo tienes usar el campo rowsource para agregar el rango de los valores.

          3- Coloca este código en el form donde quieras desabilitar la x

          Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

          If CloseMode = 0 Then Cancel = True

          End Sub

          Saludos

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies