Filtrar consulta por más de1de un criterio desde cuadro combinado en Formulario

Estoy tratando de filtrar una consulta por tres criterios, desde un formulario donde el valor proviene de cuadros combinados.

Lo intente desde el generador en consultas [Formularios]![Formulario1]![Texto3], pero no funciona. Además me justaría que si alguno o todos los criterios están en blanco me devuelva todos los valores de ese campo.

Supongo que deberé generar código para poder hacerlo. Si alguien puede ayudarme le estaría agradecido.

2 Respuestas

Respuesta

Antes de responderle le recomiendo consultar mi video Filtro avanzado por formulario en Access. Uso de la función SuperFiltro() en Access (youtube.com) .

Para filtrar una consulta en Access por múltiples criterios desde cuadros combinados en un formulario, y permitir que se devuelvan todos los valores si uno o más criterios están en blanco, puedes usar VBA para construir la cadena de la consulta dinámicamente. A continuación, le muestro cómo hacerlo:

Private Sub btnFiltrar_Click()
    Dim strSQL As String
    Dim strWhere As String
    ' Inicializar la cadena SQL base (ajústala según tu consulta)
    strSQL = "SELECT * FROM TuTabla"
    ' Construir la cláusula WHERE dinámicamente
    strWhere = ""
    If Not IsNull(Me.CmbCriterio1) Then
        strWhere = strWhere & " AND Criterio1 = '" & Me.CmbCriterio1 & "'"
    End If
    If Not IsNull(Me.CmbCriterio2) Then
        strWhere = strWhere & " AND Criterio2 = '" & Me.CmbCriterio2 & "'"
    End If
    If Not IsNull(Me.CmbCriterio3) Then
        strWhere = strWhere & " AND Criterio3 = '" & Me.CmbCriterio3 & "'"
    End If
    ' Quitar el primer "AND" si existe
    If Len(strWhere) > 0 Then
        strWhere = " WHERE " & Mid(strWhere, 6)
    End If
    ' Combinar la cláusula WHERE con la cadena SQL base
    strSQL = strSQL & strWhere
    ' Establecer el origen de la consulta del formulario (ajústalo según tu formulario o subformulario)
    Me.RecordSource = strSQL
End Sub

Nota:

  • Asegúrese de ajustar los nombres de los cuadros combinados y de la tabla (TuTabla) según a sus necesidades.
  • Si los cuadros combinados contienen valores numéricos en lugar de texto, elimine las comillas simples alrededor de los valores ('" & Me.CmbCriterio1 & "' debería ser Me. CmbCriterio1).
  • Si usa un subformulario, ajusta el RecordSource del subformulario en lugar del formulario principal.
  • Si usa mi función superfiltro() se evita todo este código. Ha tenido tanta aceptación que ahora aparece en "Copilot"

Muchas gracias por tu respuesta Eduardo,

Quisiera si te es posible que me orientes para poder abrir un informe con varios filtros

En la linea "Me.F_InformesMov.RecordSource = strSQL" me sale error no se encontró el método o dato miembro.

Y saber que tendría que agregar al código para abrir el informe filtrado

algo asi "DoCmd.OpenReport "I_Movimientosfiltros", acViewReport, , filtro?"

Private Sub btnFiltro_Click()
Dim strSQL As String
Dim strWhere As String
' Inicializar la cadena SQL base (ajústala según tu consulta)
strSQL = "SELECT * FROM I_Movimientosfiltros"
' Construir la cláusula WHERE dinámicamente
strWhere = ""
If Not IsNull(Me.CmbTipoMov) Then
strWhere = strWhere & " AND TipoMovimiento = '" & Me.CmbTipoMov & "'"
End If
If Not IsNull(Me.CmbCuenta) Then
strWhere = strWhere & " AND Cuenta = '" & Me.CmbCuenta & "'"
End If
' Quitar el primer "AND" si existe
If Len(strWhere) > 0 Then
strWhere = " WHERE " & Mid(strWhere, 6)
End If
' Combinar la cláusula WHERE con la cadena SQL base
strSQL = strSQL & strWhere
' Establecer el origen de la consulta del formulario (ajústalo según tu formulario o subformulario)
Me.F_InformesMov.RecordSource = strSQL
End Sub

Si quiere envíeme su base de datos en formato RAR a [email protected] con gusto trato de colaborarle

Esta instrucción

Me.F_InformesMov.RecordSource = strSQL

debe ser 

Me.RecordSource = strSQL
Respuesta

¿Se ha intentado utilizado la función IIF?, es una posible alternativa que las consultas permiten (la selección entre dos alternativas).

Con los escasos datos aportados (se desconoce si las condiciones se aplican a tres campos o un único campo) no se pude precisas demasiado.

Ejemplo de IIF (Access traducirá IIF al 'lenguaje' local ¿SiInm?)

IIF(Forms.[formulario_1].[combo_1] <> ""; Forms.[formulario_1].[combo_1]; "")

Access lo traducirá así:

Si en el combo_1 del formulario_1 hay un elemento seleccionado, devuelve el valor seleccionado, si no lo hay (no se selecciono uno de sus elementos) devuelve una cadena vacía (es decir: no hay filtro par esa campo).

Y así para cada combo (que si pertenecen al mismo formulario) podrían quedar así (cada uno bajo el campo que corresponda, es 'una consulta')

Criterio uno:
SiInm(Forms.[formulario_1].[combo_1] <> ""; Forms.[formulario_1].[combo_1]; "")
Criterio dos:
SiInm(Forms.[formulario_1].[combo_2] <> ""; Forms.[formulario_1].[combo_2]; "")
Criterio tres:
SiInm(Forms.[formulario_1].[combo_3] <> ""; Forms.[formulario_1].[combo_3]; "")

Si se utilizase un formulario en lugar de una consulta, el método seria mas directo y eficaz (se puede crear de forma dinámica la condición).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas