Cancelar un inputbox de un formulario

Estoy usando inputboxes para filtrar los registros. Este inputbox viene con un botón de Cancelar, pero si pulso en él (o utilizo la tecla Escape), no me lo cancela, sino que me salta otra ventana. Mirad:

Este es el código que uso:

Private Sub Comando61_Click()
    On Error Resume Next
    Dim miFiltro As String
    Dim Valor As Double
    Dim Signo As String
        If IsNumeric(Screen.PreviousControl) Then
            Signo = InputBox("Introduce el signo: mayor (>), menor (<), mayor que (>=) o menor que (<=).")
            Valor = InputBox("Introduce el valor")
            'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = Screen.PreviousControl.Name & Signo & Replace(Valor, ",", ".")
            'Aplicamos el filtro al formulario
            Me.Filter = miFiltro
            Me.FilterOn = True
        ElseIf Screen.PreviousControl.Name = "DuracionMin" Then
            Signo = InputBox("Introduce el signo: mayor (>), menor (<), mayor que (>=) o menor que (<=).")
            Valor = InputBox("Introduce el valor")
            'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = "DiasMin" & Signo & Replace(Valor, ",", ".")
            'Aplicamos el filtro al formulario
            Me.Filter = miFiltro
            Me.FilterOn = True
        ElseIf Screen.PreviousControl.Name = "DuracionMax" Then
            Signo = InputBox("Introduce el signo: mayor (>), menor (<), mayor que (>=) o menor que (<=).")
            Valor = InputBox("Introduce el valor")
            'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = "DiasMax" & Signo & Replace(Valor, ",", ".")
            'Aplicamos el filtro al formulario
            Me.Filter = miFiltro
            Me.FilterOn = True
            Exit Sub
        End If
End Sub

Según he leído, podría solucionarlo de esta manera:

If Signo <> "" Then
End If

Pero mi problema viene cuando tengo más de un inputbox. Además, si uso Exit Sub en la primera declaración del If, no me ejecuta el resto del código.

¿Cómo puedo solucionarlo?

1 Respuesta

Respuesta
1

Para detectar si se pulsa Cancelar en un inputbox, tienes la función StrPtr() Puedes ver aquí su explicación y uso: https://drive.google.com/file/d/0B91iZhlpwhqyWUctX2dabm5TcmM/view

Para controlar otro posibles valores inválidos, usa las funciones IsNull(), IsDate(), IsNumeric()...

Vale. Está genial y me ha servido. Muchas gracias. Me falta una cosa. Quiero poner un mensaje informando del error. Este es el código que me funciona perfectamente, pero sin ese mensaje:

    On Error Resume Next
    Dim miFiltro As String
    Dim Valor As Double
    Dim Signo As String
        If IsNumeric(Screen.PreviousControl) Then
            If Screen.PreviousControl.Name = "Autor" Then Exit Sub
            If Screen.PreviousControl.Name = "Subgenero" Then Exit Sub
            If Screen.PreviousControl.Name = "Formato" Then Exit Sub
            If Screen.PreviousControl.Name = "Serie" Then Exit Sub
            Signo = InputBox("Introduce el signo: mayor (>), menor (<), mayor que (>=) o menor que (<=).", "Filtrar por duracion mínima")
            If Signo <> ">" Or Signo <> "<" Or Signo <> ">=" Or Signo <> "<=" Then Exit Sub
            If StrPtr(Signo) = 0 Then Exit Sub 'Nos permite saber si el usuario cancela el inputbox
            If IsNull(Signo) Then Exit Sub 'Nos permite saber si el usuario deja en blanco el inputbox
            Valor = InputBox("Introduce el valor")
            If IsNumeric(Valor) = False Then Exit Sub
            If StrPtr(Valor) = 0 Then Exit Sub
            If IsNull(Valor) Then Exit Sub
            'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = Screen.PreviousControl.Name & Signo & Replace(Valor, ",", ".")
            'Aplicamos el filtro al formulario
            Me.Filter = miFiltro
            Me.FilterOn = True
      End If

Y este es el código para mostrar ese mensaje.

Private Sub Comando61_Click()
    On Error Resume Next
    Dim miFiltro As String
    Dim Valor As Double
    Dim Signo As String
        If IsNumeric(Screen.PreviousControl) Then
            If Screen.PreviousControl.Name = "Autor" Then Exit Sub
            If Screen.PreviousControl.Name = "Subgenero" Then Exit Sub
            If Screen.PreviousControl.Name = "Formato" Then Exit Sub
            If Screen.PreviousControl.Name = "Serie" Then Exit Sub
            Signo = InputBox("Introduce el signo: mayor (>), menor (<), mayor que (>=) o menor que (<=).", "Filtrar por " & LCase(Screen.PreviousControl.Name))
            If Signo <> ">" Or Signo <> "<" Or Signo <> ">=" Or Signo <> "<=" Then
            MsgBox "Has introducido un carácter erróneo.", vbInformation
            Exit Sub
            End If
            If StrPtr(Signo) = 0 Then
            Exit Sub 'Nos permite saber si el usuario cancela el inputbox
            End If
            If IsNull(Signo) Then
            MsgBox "Debes introducir un carácter válido", vbInformation
            Exit Sub 'Nos permite saber si el usuario deja en blanco el inputbox
            End If
            Valor = InputBox("Introduce el valor")
            If IsNumeric(Valor) = False Then Exit Sub
            If StrPtr(Valor) = 0 Then Exit Sub
            If IsNull(Valor) Then Exit Sub
            'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = Screen.PreviousControl.Name & Signo & Replace(Valor, ",", ".")
            'Aplicamos el filtro al formulario
            Me.Filter = miFiltro
            Me.FilterOn = True
       End If

Sin embargo, al probar las tres opciones que tengo (un valor distinto del esos símbolos, cancelar o valor vacío), me muestra el primer mensaje ("Has introducido un carácter erróneo").

Y otra cosa. No me reconoce esta parte:

If Signo <> ">" Or Signo <> "<" Or Signo <> ">=" Or Signo <> "<=" Then

Lógicamente te muestra el primer mensaje de error, porque no se cumple esa primera condición . El orden en que validas los datos es importante..

Claro, llevas razón, pero es porque en esa primera condición le estoy diciendo que si es distinto a los símbolos de mayor, menor... que lo cancele, y no lo coge bien. ¿Cómo puedo solucionarlo?

Ordena los Ifs de otra forma, evidentemente... jejeje

Yo siempre pongo primero para controlar si se pulsa "Cancelar", luego si no se escribió nada, y luego el resto de validaciones que tenga que hacer según el tipo de dato que pida en el inputbox

La pregunta no admite más respuestas

Más respuestas relacionadas