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

Respuesta
2

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 código se ejecuta cuando doy click al botón guardar

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?

Cambiá VAL por CDbl:

If Cdbl(TANQUE1_DIESEL) > Application ....

Sdos!

¡Gracias! 

Perfecto voy a ajustarlo... :-)

Dios te bendiga

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.

Deja una nueva consulta en el tablón explicando claramente lo que necesitas.

Entiendo que necesitas 2 nuevas validaciones... aclara entonces si se debe mantener la validación del máx agregando las nuevas condiciones o no.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas