Saltar al contenido

filtrar múltiples criterios usando excel vba

Ya no busques más por todo internet porque estás al espacio indicado, contamos con la respuesta que necesitas pero sin problema.

Solución:

Creo (a partir de la experimentación, MSDN no es útil aquí) que no hay una forma directa de hacer esto. Ajuste Criteria1 a una Array es equivalente a usar las casillas de verificación en el menú desplegable; como usted dice, solo filtrará una lista basada en elementos que coincidan con uno de los que están en el array.

Curiosamente, si tienes los valores literales "<>A" y "<>B" en la lista y filtrar en estos el macro la grabadora viene con

Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"

que funciona Pero si luego tienes el valor literal "<>C" también y filtra por los tres (usando casillas de verificación) mientras graba un macroel macro grabadora replica con precisión su código que luego falla con un error. Supongo que lo llamaría un error: hay filtros que puede hacer usando la interfaz de usuario que no puede hacer con VBA.

De todos modos, volviendo a tu problema. Es posible filtrar valores que no son iguales a algunos criterios, pero solo hasta dos valores, lo que no funciona para usted:

Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd

Hay un par de soluciones posibles dependiendo del problema exacto:

  1. Use una “columna auxiliar” con una fórmula en la columna B y luego filtre eso, por ejemplo =ISNUMBER(A2) o =NOT(A2="A", A2="B", A2="C") luego filtrar TRUE
  2. Si no puede agregar una columna, use el autofiltro con Criteria1:=">-65535" (o un número adecuado inferior al que espera) que filtrará los valores no numéricos, suponiendo que esto es lo que desea
  3. Escriba un sub VBA para ocultar filas (no es exactamente lo mismo que un autofiltro, pero puede ser suficiente según sus necesidades).

Por ejemplo:

Public Sub hideABCRows(rangeToFilter As Range)
  Dim oCurrentCell As Range
  On Error GoTo errHandler

  Application.ScreenUpdating = False
  For Each oCurrentCell In rangeToFilter.Cells
    If oCurrentCell.Value = "A" Or oCurrentCell.Value = "B" Or oCurrentCell.Value = "C" Then
      oCurrentCell.EntireRow.Hidden = True
    End If
  Next oCurrentCell

  Application.ScreenUpdating = True
  Exit Sub

errHandler:
    Application.ScreenUpdating = True
End Sub

Tienes la posibilidad compartir este enunciado si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *