valores - filtro personalizado en excel definicion
Establecer filtro automático de varios comodines (3)
Pruebe el siguiente código:
max 2 expresiones comodín para Criteria1 funciona. Referir este enlace
Sub AutoFilter()
With ThisWorkbook.Sheets("sheet1").Range("A:E")
.AutoFilter Field:=2, Criteria1:=Array("*M1454*", "*M1467*"), Operator:=xlFilterValues
.AutoFilter Field:=5, Criteria1:="=PROD", Operator:=xlOr, Criteria2:="=RISK"
End With
End Sub
En este momento estoy haciendo la codificación para establecer un filtro para una tabla de datos. Básicamente, no sé cómo publicar la hoja de datos aquí, así que intente escribirlos):
(comenzando desde la izquierda está la columna A) Nombre * BDevice * Cantidad * Venta * Propietario
Básicamente necesito filtrar por 2 columnas: -El dispositivo B con cualquier palabra que contenga "M1454" o "M1467" o "M1879" (significa que M1454A o M1467TR todavía encajarían) -El propietario con PROD o RISK
Aquí está el código que escribí:
Sub AutoFilter()
ActiveWorkbook.ActiveSheet..Range(B:B).Select
Selection.Autofilter Field:=1 Criteria1:=Array( _
"*M1454*", "*M1467*", "*M1879*"), Operator:=xlFilterValues
Selection.AutoFilter Field:=4 Criteria1:="=PROD" _
, Operator:=xlOr, Criteria2:="=RISK"
End Sub
Cuando ejecuto el código, la máquina devuelve el error 1004 y la parte que parece estar equivocada es la parte 2 del filtro (no estoy seguro del uso de Field, así que no puedo decirlo con certeza)
Editar; Santosh: Cuando pruebo tu código, la máquina obtiene el subíndice del error 9 fuera del rango. El error vino de la declaración con. (dado que la tabla de datos tiene una columna A a AS, entonces simplemente cambio a A: AS)
Si bien hay un máximo de dos comodines directos por campo en el método de Autofiltro , la coincidencia de patrones se puede usar para crear una matriz que reemplace los comodines con la opción Operador: = xlFilterValues . Una sentencia Select Case ayuda a la coincidencia de comodines.
El segundo campo es una simple coincidencia directa de Criteria1 y Criteria2 con un Operador: = xlOr que une los dos criterios.
Sub multiWildcardFilter()
Dim a As Long, aARRs As Variant, dVALs As Object
Set dVALs = CreateObject("Scripting.Dictionary")
dVALs.CompareMode = vbTextCompare
With Worksheets("Sheet1")
If .AutoFilterMode Then .AutoFilterMode = False
With .Cells(1, 1).CurrentRegion
''build a dictionary so the keys can be used as the array filter
aARRs = .Columns(2).Cells.Value2
For a = LBound(aARRs, 1) + 1 To UBound(aARRs, 1)
Select Case True
Case aARRs(a, 1) Like "MK1454*"
dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
Case aARRs(a, 1) Like "MK1467*"
dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
Case aARRs(a, 1) Like "MK1879*"
dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1)
Case Else
''no match. do nothing
End Select
Next a
''filter on column B if dictionary keys exist
If CBool(dVALs.Count) Then _
.AutoFilter Field:=2, Criteria1:=dVALs.keys, _
Operator:=xlFilterValues, VisibleDropDown:=False
''filter on column E
.AutoFilter Field:=5, Criteria1:="PROD", Operator:=xlOr, _
Criteria2:="RISK", VisibleDropDown:=False
''data is filtered on MK1454*, MK1467* or MK1879* (column B)
''column E is either PROD or RISK
''Perform work on filtered data here
End With
If .AutoFilterMode Then .AutoFilterMode = False
End With
dVALs.RemoveAll: Set dVALs = Nothing
End Sub
Si se van a agregar exclusiones¹ al filtro, su lógica debe colocarse en la parte superior de la instrucción Select .. End Select para que no se agreguen mediante un falso positivo a otros criterios coincidentes.
Antes de aplicar el método AutoFilter
Después de aplicar AutoFilter w / multiple wildcards
¹ Consulte ¿Pueden los criterios del filtro avanzado estar en el VBA en lugar de en un rango? y ¿Puede AutoFilter tomar los comodines inclusivos y no inclusivos de las teclas del Diccionario? para obtener más información sobre cómo agregar exclusiones al conjunto de filtros del diccionario.
Para usar cadenas parciales para excluir filas e incluir espacios en blanco, debe usar
''From Jeeped''s code
Dim dVals As Scripting.Dictionary
Set dVals = CreateObject("Scripting.Dictionary")
dVals.CompareMode = vbTextCompare
Dim col3() As Variant
Dim col3init As Integer
''Swallow row3 into an array; start from 1 so it corresponds to row
For col3init = 1 to Sheets("Sheet1").UsedRange.Rows.count
col3(col3init) = Sheets("Sheet1").Range(Cells(col3init,3),Cells(col3init,3)).Value
Next col3init
Dim excludeArray() As Variant
''Partial strings in below array will be checked against rows
excludeArray = Array("MK1", "MK2", "MK3")
Dim col3check As Integer
Dim excludecheck as Integer
Dim violations As Integer
For col3check = 1 to UBound(col3)
For excludecheck = 0 to UBound(excludeArray)
If Instr(1,col3(col3check),excludeArray(excludecheck)) <> 0 Then
violations = violations + 1
''Sometimes the partial string you''re filtering out for may appear more than once.
End If
Next col3check
If violations = 0 and Not dVals.Exists(col3(col3check)) Then
dVals.Add Key:=col3(col3check), Item:=col3(col3check) ''adds keys for items where the partial strings in excludeArray do NOT appear
ElseIf col3(col3check) = "" Then
dVals.Item(Chr(61)) = Chr(61) ''blanks
End If
violations = 0
Next col3check
La idea de dVals.Item (Chr (61)) = Chr (61) provino de la otra respuesta de Jeeped aquí. Los criterios de filtro múltiple para espacios en blanco y números usando comodín en el mismo campo simplemente no funcionan.