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 🙂
Hola,Como sería una macro que permita solo números del 1 al 10 y que no se repita ninguno, me refiero a que valide estos dos criterios.Gracias!!
Hola Anónimo;Tienes la solución en el siguiente enlace: http://goo.gl/B8y8sI Te llevará a una descargar directa con un ejemplo. Además ha añadido la funcionalidad para que grabe los datos numéricos en una hoja.No olvides comentar si te ha servido de ayuda.Saludos.
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,
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
Excelente ayuda, con esto he resuelto mi problema.agradezco nuevamente tu aporte 🙂 espero seguir dando lata por aquí.Saludos.
Perfecto Anónimo,Cuando necesites ayuda ya sabes 🙂 Saludos!!
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.
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.
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!
Agrego algo, si hago es_numero = WorksheetFunction.IsNumber(FormularioVenta.Cantidad.Value) , siempre me otorga Falso
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
SOLO FUNCIONA PARA NUMEROS, si quisiera hacer solo textual
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.
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.
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.
‘
‘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.
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
Muchas gracias, excelente explicación me sirvió de maravilla para terminar mi trabajo.
Saludos desde Chile.
Hola Buenas noches disculpe una formula para validar casillas solo de tipo numerico para macros (vba)
Con la función isnumeric lo puedes hacer. Por ejemplo:
If IsNumeric(Cells(1, 1)) Then
Aquí comprobamos si la celda A1 es numerica.
Saludos