Validar Textbox al cargar datos en los mismos.
En una base de datos registro diariamente por fecha (filas) el consumo de un tanque de combustible en la columna "F", lo que busco con la validación del textbox es que no me guarde datos mayores a los registrados en dicha columna, es decir, si ayer el usuario registro un nivel de 1500 litros hoy no pueda registrar un nivel mayor porque hubo un consumo, el nivel puede hoy estar igual pero no mayor.
1 respuesta
Este puede ser un modo de controlarlo, al salir del textbox donde se ingresa la cantidad .
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'x Elsamatilde canti = Application.Max(ActiveSheet.Range("F:F")) If Val(TextBox1) > canti Then MsgBox "No puedes ingresar un valor mayor a " & canti & ".", , "ERROR" Cancel = True End If End Sub
Debes ajustar el nombre del control (en mi caso TextBox1) y la hoja donde se encuentre la col F (en mi caso la hoja activa).
Estoy considerando que son valores enteros, sin decimales. Si necesitas algún ajuste avisame.
Sdos.
Elsa
Saludos Elsa!
La hoja donde guardo los datos se llama "DIESEL" y el textbox se llama "TANQUE1_DIESEL" ahora bien yo registro los datos varios tanques mediante un botón con una ciertas condiciones:
Sheets("DIESEL").Select FECHA.SetFocus fila = Range("A9").End(xlDown).Offset(1, 0).Row If FECHA = Empty Then MsgBox ("El campo fecha esta vacio"), vbCritical, "Advertencia" FECHA.BackColor = &HFF& ElseIf DIA = Empty Then MsgBox ("El campo dia esta vacio"), vbCritical, "Advertencia" DIA.BackColor = &HFF& DIA.SetFocus ElseIf HORA = Empty Then MsgBox ("Ingresa la hora correspondiente"), vbCritical, "Advertencia" HORA.BackColor = &HFF& HORA.SetFocus ElseIf TURNO = Empty Then MsgBox ("Ingresa el turno correspondiente"), vbCritical, "Advertencia" TURNO.BackColor = &HFF& TURNO.SetFocus ElseIf RESPONSABLE = Empty Then MsgBox ("¿Quien es el responsable del turno?"), vbCritical, "Advertencia" RESPONSABLE.BackColor = &HFF& RESPONSABLE.SetFocus ElseIf TANQUE1_DIESEL = Empty Then MsgBox ("Ingresa el nivel del Tanque 1 principal de Diesel"), vbCritical, "Advertencia" TANQUE1_DIESEL.BackColor = &HFF& TANQUE1_DIESEL.SetFocus ElseIf TANQUE2_DIESEL = Empty Then MsgBox ("Ingresa el nivel del Tanque 2 principal de Diesel"), vbCritical, "Advertencia" TANQUE2_DIESEL.BackColor = &HFF& TANQUE2_DIESEL.SetFocus ElseIf GANDOLA_DIESEL = Empty Then MsgBox ("Ingresa el volumen de litros que descargo la gandola"), vbCritical, "Advertencia" GANDOLA_DIESEL.BackColor = &HFF& GANDOLA_DIESEL.SetFocus ElseIf TANQUE1_CALDERAS = Empty Then MsgBox ("Ingresa el nivel del Tanque 1 de calderas"), vbCritical, "Advertencia" TANQUE1_CALDERAS.BackColor = &HFF& TANQUE1_CALDERAS.SetFocus ElseIf TANQUE2_CALDERAS = Empty Then MsgBox ("Ingresa el nivel del Tanque 2 de calderas"), vbCritical, "Advertencia" TANQUE2_CALDERAS.BackColor = &HFF& TANQUE2_CALDERAS.SetFocus ElseIf TANQUE_GENERADORES = Empty Then MsgBox ("Ingresa el nivel del Tanque de los generadores"), vbCritical, "Advertencia" TANQUE_GENERADORES.BackColor = &HFF& TANQUE_GENERADORES.SetFocus ElseIf TANQUE_PTAR = Empty Then MsgBox ("Ingresa el nivel del Tanque de Ptar"), vbCritical, "Advertencia" TANQUE_PTAR.BackColor = &HFF& TANQUE_PTAR.SetFocus Else Cells(fila, 1).Value = FECHA FECHA.BackColor = &HFFFFFF Cells(fila, 2).Value = DIA DIA.BackColor = &HFFFFFF Cells(fila, 3).Value = HORA HORA.BackColor = &HFFFFFF Cells(fila, 4).Value = TURNO TURNO.BackColor = &HFFFFFF Cells(fila, 5).Value = RESPONSABLE RESPONSABLE.BackColor = &HFFFFFF Cells(fila, 6).Value = Val(TANQUE1_DIESEL) TANQUE1_DIESEL.BackColor = &HFFFFFF Cells(fila, 8).Value = Val(TANQUE2_DIESEL) TANQUE2_DIESEL.BackColor = &HFFFFFF Cells(fila, 10).Value = Val(TANQUE_PTAR) TANQUE_PTAR.BackColor = &HFFFFFF Cells(fila, 12).Value = Val(TANQUE_GENERADORES) TANQUE_GENERADORES.BackColor = &HFFFFFF Cells(fila, 14).Value = Val(TANQUE1_CALDERAS) TANQUE1_CALDERAS.BackColor = &HFFFFFF Cells(fila, 16).Value = Val(TANQUE2_CALDERAS) TANQUE2_CALDERAS.BackColor = &HFFFFFF Cells(fila, 20).Value = Val(GANDOLA_DIESEL) GANDOLA_DIESEL.BackColor = &HFFFFFF MsgBox ("Datos cargados con exito"), vbInformation, "Aviso" FECHA = Empty DIA = Empty HORA = Empty TURNO = Empty RESPONSABLE = Empty TANQUE1_DIESEL = Empty TANQUE2_DIESEL = Empty TANQUE_PTAR = Empty TANQUE_GENERADORES = Empty TANQUE1_CALDERAS = Empty TANQUE2_CALDERAS = Empty GANDOLA_DIESEL = Empty Exit Sub End If
¿Como puedo adaptar tu código? o ¿Puedo colocarlo aparte y no me afecta?
El evento Textbox1_Exit se ejecuta al momento en que alimentas ese control y avanzas hacia otro... es decir que se ejecuta al momento de cargar datos allí, antes del botón de guardar. Y si no cumple con la condición se quedará allí para que vuelvas a intentarlo.
Private Sub TANQUE1_DIESEL(ByVal Cancel As MSForms.ReturnBoolean) 'x Elsamatilde canti = Application.Max(Sheets("DIESEL").Range("F:F")) If Val(TANQUE1_DIESEL) > canti Then MsgBox "No puedes ingresar un valor mayor a " & canti & ".", , "ERROR" Cancel = True End If End Sub
Probalo y comentame.
Sdos!
Quedó mal copiada... aquí va correcta.
Private Sub TANQUE1_DIESEL_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'x Elsamatilde canti = Application.Max(Sheets("DIESEL").Range("F:F")) If Val(TANQUE1_DIESEL) > canti Then MsgBox "No puedes ingresar un valor mayor a " & canti & ".", , "ERROR" Cancel = True End If End Sub
Ups! No funciono :-( cargo el dato en el textbox y al presionar tabulador sigo llenando datos en los demás textbox...
SI FUNCIONA.
Dejo una imagen para que veas las condiciones de mi macro y quizás tus datos no sean tal como lo comentaste (nombre de hoja, nombre de control, col a revisar).
También podés realizar este control directamente en el botón de guardado. En ese caso NO colocarás esta subrutina del botón sino que debes ajustar tu código mayor agregando lo que aparece a continuación de 'agregar control...
ElseIf TANQUE1_DIESEL = Empty Then MsgBox ("Ingresa el nivel del Tanque 1 principal de Diesel"), vbCritical, "Advertencia" TANQUE1_DIESEL.BackColor = &HFF& TANQUE1_DIESEL.SetFocus 'agregar control de consumo ElseIf Val(TANQUE1_DIESEL) > Application.Max(Sheets("DIESEL").Range("F:F")) Then MsgBox "No puedes ingresar un valor mayor al mayor consumo.", , "ERROR" TANQUE1_DIESEL.BackColor = &HFF& TANQUE1_DIESEL. SetFocus
Quizás no esté clara la condición... aquí se evalúa que no supere al máx ingresado en col F que puede ser el último registro como cualquier otro.. deja un ejemplo o imagen de la col F para comprenderlo mejor.
PD) Le agregué una línea a mi rutina del textbox para forzar a que se ingrese nuevamente.
Private Sub TANQUE1_DIESEL_EXIT(ByVal Cancel As MSForms.ReturnBoolean) 'x Elsamatilde canti = Application.Max(Sheets("DIESEL").Range("F:F")) If Val(TANQUE1_DIESEL) > canti Then MsgBox "No puedes ingresar un valor mayor a " & canti & ".", , "ERROR" TANQUE1_DIESEL = "" Cancel = True End If End Sub
Saludos Elsa!!
Estuve revisando mi código encontré varios errores que posiblemente no me permiten ejecutar el que me pasaste, pido disculpas.
Si me parece mejor efectuar esta acción con el botón, así el usuario esta obligado a corregir el dato o tomarlo de nuevo para poder cargar la información completa y efectivamente este debe ser menor al ultimo registro por el consumo.
En ese caso ¿Como cambiaría el código?
Fabuloso Elsa!
Fije el código en el botón como me lo recomendaste, le añadí una variable para que me muestre el valor y pueda comparar el error y de manera exitosa dio con el resultado.
Muy agradecido por tu ayuda. Dios te bendiga
Saludos Elsa...
Te escribo porque necesito realizar un ajuste al código que me facilitaste para validar la carga de textbox, el cual fue este:
ElseIf TANQUE1_DIESEL = Empty Then MsgBox ("Ingresa el nivel del Tanque 1 principal de Diesel"), vbCritical, "Advertencia" TANQUE1_DIESEL.BackColor = &HFF& TANQUE1_DIESEL.SetFocus 'agregar control de consumo ElseIf Val(TANQUE1_DIESEL) > Application.Max(Sheets("DIESEL").Range("F:F")) Then MsgBox "No puedes ingresar un valor mayor al mayor consumo.", , "ERROR" TANQUE1_DIESEL.BackColor = &HFF& TANQUE1_DIESEL. SetFocus
Funciona sin problemas pero ahora estoy validando valores enteros con decimales y en ese caso no me valida como quisiera, es decir si comparo 452,25 >452,30 no me guarda el valor únicamente un punto por encima cuando registro 453 > 452,25 en este caso si me guarda el valor, ¿Que ajuste hay que hacer?
Saludos Elsa!!
En esta oportunidad te escribo porque estoy validando lo que ingreso en el textbox pero quiero compararlo con el ultimo valor que registre en la columna I.
¿Que puedo hacer?
Estoy utilizando esta instrucción:
ElseIf NIVEL_T1 = Empty Then MsgBox ("Ingresa el nivel del Tanque 1"), vbCritical, "Advertencia" NIVEL_T1.BackColor = &HFF& NIVEL_T1.SetFocus ElseIf NIVEL_T1 > Application.Max(Sheets("DIESEL").Range("I:I")) Then valor = Application.Max(Sheets("DIESEL").Range("I:I")) MsgBox ("El nivel ingresado no puede ser mayor a: " & valor & " cm"), vbCritical, "ERROR" NIVEL_T1.BackColor = &HFF& NIVEL_T1.SetFocus ElseIf LLENADO_T1 = Empty Then MsgBox ("Si no hay descarga de gandola al tanque, asigna el valor cero"), vbCritical, "Advertencia" LLENADO_T1.BackColor = &HFF& LLENADO_T1.SetFocus ElseIf VACIADO_T1 = Empty Then MsgBox ("Si no hay trasvase a ningun tanque, asigna el valor cero"), vbCritical, "Advertencia" VACIADO_T1.BackColor = &HFF& VACIADO_T1.SetFocus ElseIf Val(NIVEL_T1 + LLENADO_T1 - VACIADO_T1) > 284 Then MsgBox "El nivel total no puede ser mayor a: " & 284 & " cm &" & 46200 & " litros ", vbCritical, "ERROR" NIVEL_T1.BackColor = &HFF& NIVEL_T1.SetFocus
Como puedes apreciar la instrucción me arroja el valor mayor que se encuentre en esa columna, deseo es comparar con el ultimo valor de la columna.
Si te fijas al final del código, realizo otra validación donde la suma de los tres textbox no supere 284, no me esta funcionando... ¿Que puedo hacer?
Gracias de antemano.
- Compartir respuesta