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

una - filtro avanzado excel copiar a otra hoja



¿Pueden los criterios de filtro avanzado estar en el VBA en lugar de en un rango? (1)

Después de intentar en vano establecer más de 2 criterios en una forma de AutoFiltro normal a través de VBA, he aprendido que debe hacerse a través de un filtro avanzado.

ejemplo ofensivo:

Worksheets(1).Range("A1").AutoFilter Field:=ColNum, Criteria1:="A*", Operator:=xlOr, Criteria2:="B*", Operator:=xlOr, Criteria3:="C*"

Espero pasar los criterios a través de una función (en lugar de una macro) de un script de PowerShell. Lo tengo todo funcionando bien y como se esperaba para 1 criterio, pero ahora me gustaría 3.

Supongo que podría escribir una macro para insertar una nueva hoja, escribir los criterios y luego filtrar en ese nuevo rango, pero preferiría verificar primero la forma preferida.


Para filtrar en varios comodines, cree una matriz variante de coincidencias de comodines y luego use la matriz de valores completos con el método estándar de Autofiltro. Puede minimizar la matriz al poner un objeto de diccionario para usar con su propiedad de índice única.

Considere los siguientes datos de muestra.

Ejecute este código.

Sub multiWildcards() Dim v As Long, vVALs As Variant, dVALs As Object Dim colNum As Long Set dVALs = CreateObject("Scripting.Dictionary") dVALs.comparemode = vbTextCompare colNum = 2 ''column B With Worksheets(1) If .AutoFilterMode Then .AutoFilterMode = False With .Cells(1, 1).CurrentRegion vVALs = .Columns(colNum).Cells.Value2 For v = LBound(vVALs, 1) To UBound(vVALs, 1) If Not dVALs.exists(vVALs(v, 1)) Then Select Case UCase(Left(vVALs(v, 1), 1)) Case "A", "B", "C" dVALs.Add Key:=vVALs(v, 1), Item:=vVALs(v, 1) Case Else ''do nothing End Select End If Next v If CBool(dVALs.Count) Then ''populated the dictionary; now use the keys .AutoFilter Field:=colNum, Criteria1:=dVALs.keys, Operator:=xlFilterValues Else Debug.Print "Nothing to filter on; dictionary is empty" End If ''.CurrentRegion is now filtered on A*, B*, C* in column B ''do something with it End With End With dVALs.RemoveAll: Set dVALs = Nothing End Sub

Los resultados deberían ser:

Estos resultados se pueden duplicar con muchos otros escenarios de comodines. La sentencia Select Case es ideal, ya que admite la palabra clave Like para crear su colección de coincidencias. Al comenzar con un vaciado de valores en una matriz de variante normal, se puede hacer un ciclo de hasta grandes filas de datos rápidamente.