excel - varias - VBA para filtrar columnas
macro para filtrar varias columnas (1)
Tengo una gran hoja similar a una base de datos, la primera fila contiene encabezados. Me gustaría un subconjunto de filas de esta tabla basado en valores de columna. Dos problemas:
1) VBA-wise Me gustaría recorrer las columnas, cuando los valores de todas las columnas necesarias coincidan, copie toda la fila en una nueva hoja.
2) El subconjunto de filas se basa en una lista. Acabo de leer que puedo usar Autofilter con una matriz. ¿Es posible ingresar esta matriz desde una columna en lugar de ingresarla manualmente en el código de VBA? La lista que estoy usando consta de 200 cadenas diferentes y se actualizará periódicamente.
Donde CritList es la lista de cadenas. Todavía tengo que averiguar cómo, pero ahora me voy de la oficina, así que mañana más.
EDIT1 Gracias a @DougGlancy; el autofiltrado funciona ahora. Aquí está su hermoso código (solo agregué el filtro de matriz).
EDIT2 Incluye un filtro de matriz más elaborado, donde NameList es la lista que me gustaría filtrar. ¡Ahora todo funciona!
Sub FilterAndCopy()
Dim LastRow As Long
Dim vName As Variant
Dim rngName As Range
Set rngName = Sheets("Sheet3").Range("NameList")
vName = rngName.Value
Sheets("Sheet2").UsedRange.Offset(0).ClearContents
With Worksheets("Sheet1")
.Range("A:E").AutoFilter
''Array filter from NameList
.Range("A:J").AutoFilter Field:=3, Criteria1:=Application.Transpose(vName), _
Operator:=xlFilterValues
.Range("A:E").AutoFilter field:=2, Criteria1:="=String1" _
, Operator:=xlOr, Criteria2:="=string2"
.Range("A:E").AutoFilter field:=3, Criteria1:=">0", _
.Range("A:E").AutoFilter field:=5, Criteria1:="Number"
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
Destination:=Sheets("Sheet2").Range("A1")
End With
End Sub
Aquí hay un enfoque diferente. El corazón de esto fue creado al encender la Grabadora de macros y al filtrar las columnas según sus especificaciones. Luego hay un poco de código para copiar los resultados. Se ejecutará más rápido que el bucle a través de cada fila y columna:
Sub FilterAndCopy()
Dim LastRow As Long
Sheets("Sheet2").UsedRange.Offset(0).ClearContents
With Worksheets("Sheet1")
.Range("$A:$E").AutoFilter
.Range("$A:$E").AutoFilter field:=1, Criteria1:="#N/A"
.Range("$A:$E").AutoFilter field:=2, Criteria1:="=String1", Operator:=xlOr, Criteria2:="=string2"
.Range("$A:$E").AutoFilter field:=3, Criteria1:=">0"
.Range("$A:$E").AutoFilter field:=5, Criteria1:="Number"
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
Destination:=Sheets("Sheet2").Range("A1")
End With
End Sub
Como nota al margen, su código tiene más bucles y variables de contador de lo necesario. No necesitarías recorrer las columnas, solo a través de las filas. Luego verificaría las distintas celdas de interés en esa fila, al igual que usted.