Averiguar qué tipo de campo es

Estoy intentando averiguar el tipo de campo activo, es decir, si es un checkbox, o un combobox, pero no me funciona, ya que me devuelve valor "Nothing". Este es el código que uso:

Public Function FiltrarPorSeleccion(FName As Form, miSel As String, FiltroForm As String)
    On Error Resume Next
    Dim miFiltro As String
    Dim Ctrl As Control
    Dim Field As String
    If TypeOf Ctrl Is ComboBox Then
        Field = Screen.PreviousControl.Name & "1"
        miFiltro = Field & " LIKE '*" & miSel & "*'"
    ElseIf TypeOf Ctrl Is CheckBox Then
        FName.Filter = Screen.PreviousControl.Object & " = " & Screen.PreviousControl
        FName.FilterOn = True
    Else
        'Comprobamos que se haya escrito algo en el cuadro de texto
        If Nz(miSel, "") = "" Then
            'Call FiltrarPorNumero(Me)
            MsgBox "No has seleccionado nada para buscar", vbInformation, "ERROR"
            Exit Function
    End If
        'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = Screen.PreviousControl.Name & " LIKE '*" & miSel & "*'"
        'Aplicamos el filtro al formulario
                If FiltroForm = "" Then
                    FiltroForm = miFiltro
                    FName.Filter = miFiltro
                    FName.FilterOn = True
                Else
                    FName.Filter = "(" & FiltroForm & ") And (" & miFiltro & ")"
                    FName.FilterOn = True
                End If
    End If
End Function

¿En qué me estoy equivocando?

1 Respuesta

Respuesta
2

Tienes varios errores:

1º/ Y el más importante: ese no es un código válido para VBA, pero no te enteras de que te da error por el "control" de errores que has puesto. Si comentas o quitas la linea del "on error resume next", verás que te salta un error en el primer If. Yo utilizaría las propias propiedades del objeto Ctrl que tiene una (ControlType) que devuelve el tipo de control. (Puedes ver cómo sería si buscas cómo recorrer los controles de un formulario, por ejemplo aquí: Ciclo do while en access vba )

2º/ Declaras una variable Ctrl, y pretendes evaluarla sin antes haberle asignado un valor (un control de tu formulario): o bien la pasas como argumento de la función, o bien se la asignas con un Set Ctrl=...

A ver si con estas pistas vas avanzando... ;-)

Hola. A ver.

He probado con este código, pero me sigue dando error:

Public Function FiltrarPorSeleccion(FName As Form, miSel As String, FiltroForm As String)
    'On Error Resume Next
    Dim miFiltro As String
    Dim Ctrl As Control
    Set Ctrl = Screen.ActiveControl
    Dim Field As String
    For Each Ctrl In FName.Controls
    Select Case Ctrl.ControlType
        Case acComboBox
            Field = Screen.PreviousControl.Name & "1"
            miFiltro = Field & " LIKE '*" & miSel & "*'"
        Case acCheckBox
            FName.Filter = Screen.PreviousControl.Name & " = " & Screen.PreviousControl
            FName.FilterOn = True
        Case Else
            'Comprobamos que se haya escrito algo en el cuadro de texto
            If Nz(miSel, "") = "" Then
                'Call FiltrarPorNumero(Me)
                MsgBox "No has seleccionado nada para buscar", vbInformation, "ERROR"
                Exit Function
            End If
        End Select
    Next Ctrl
        'Cojemos el valor seleccionado y el campo y creamos el filtro por aproximación
            miFiltro = Screen.PreviousControl.Name & " LIKE '*" & miSel & "*'"
        'Aplicamos el filtro al formulario
                If FiltroForm = "" Then
                    FiltroForm = miFiltro
                    FName.Filter = miFiltro
                    FName.FilterOn = True
                Else
                    FName.Filter = "(" & FiltroForm & ") And (" & miFiltro & ")"
                    FName.FilterOn = True
                End If
End Function

Si ejecuto este código, el primer error que me dice es "El objeto no admite esta propiedad o método", en la siguiete línea:

FName.Filter = Screen.PreviousControl.Name & " = " & Screen.PreviousControl

Esto me revela que no estoy dándole el valor correcto a Ctrl. Lo he puesto como Screen.ActiveControl, pero esa no es la solución, y no se me ocurre otra.

Además, no entiendo por qué tengo que hacer un For Each ... Next, cuando solo quiero verificar si el control en que me posiciono es un ComboBox o un CheckBox. Eso lo que hace es recorrer todos los controles, ¿verdad?

¡Gracias!

Lo primero, no necesitas hacer el bucle for next, en ningún momento te lo sugerí (te remití a ese código solo para que vieras cómo usar la propiedad ControlType).

Lo segundo, asignar a la variable Ctrl el valor de screen. Activecontrol no sé si es lo más adecuado porque desconozco desde dónde llamas a la función, pero si lo haces desde un botón, el control activo será ese botón y tu código "al traste"...

Te subo un mini-ejemplo "a lo rápido" para que veas cómo puedes identificar el tipo de control y su valor, y te dejo a ti la tarea de adaptarlo para crear los filtros: http://www.filebig.net/files/fKKbSDJyrg

Corrijo mi primera respuesta: el código inicial sí sirve para VBA, pero no funciona porque Ctrl no tenía valor asignado.

La pregunta no admite más respuestas

Más respuestas relacionadas