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.