varios valores una personalizado para otra macro hoja filtros filtro filtrar entre definicion datos criterios copiar comodines como avanzados avanzado excel vba excel-vba dictionary autofilter

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.