excel - para - macro copiar y pegar abajo de lo que ya pego anterior
VBA Copie y pegue en otra hoja de AutoFilter sacando una fila (3)
Tengo un AutoFilter
que una vez que se aplica, siempre genera una row
. Quiero copy
esta row
y paste
en otra Sheet
.
He considerado:
-
xlCellTypeAllValidation
pero arroja unerror
-
xlCellTypeSameValidation
hay muchos criterios de validación unAutoFilter
-
xlCellTypeLastCell
pero da la ubicación de la últimacell
en larow
filtrada
¿Cómo puedo hacer esto?
Aquí hay un extracto de mi code
:
With ThisWorkbook.Sheets(k).Range("A1:AZ1")
.Value = .Value
.AutoFilter field:=1, Criteria1:=Rev_1
.AutoFilter field:=11, Criteria1:=Beginnings(k)
.AutoFilter field:=12, Criteria1:=End_Instnts(k)
For zz = 13 To last_Field
.AutoFilter field:=zz, Criteria1:=""
Next zz
.SpecialCells(xlCellTypeLastCell).Select
.Range.Select
ThisWorkbook.Sheets(k).AutoFilterMode = False
End With
Puede seleccionar toda la región filtrada y luego copiarla, copiará las filas visibles solo de todos modos. O combínelo con .SpeciallCells (xlCellTypeVisible)
Smthng like (después de finalizar con) (asumiendo que los datos comiencen desde la fila 2)
Range("A2:AZ1").Copy Destination:=PasteRange
Recomiendo probar para asegurarse de que algo coincida con los criterios antes de copiar, algo así como:
With ThisWorkbook.Sheets(k).Range("A1").CurrentRegion.Resize(, 52)
.Value = .Value
.AutoFilter field:=1, Criteria1:=Rev_1
.AutoFilter field:=11, Criteria1:=Beginnings(k)
.AutoFilter field:=12, Criteria1:=End_Instnts(k)
For zz = 13 To last_Field
.AutoFilter field:=zz, Criteria1:=""
Next zz
'' make sure there are results matching filter
If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
'' offset and resize to avoid headers then copy
.Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy Destination:=Sheets("other sheet").Range("A1")
End If
ThisWorkbook.Sheets(k).AutoFilterMode = False
End With
Un enfoque es utilizar células especiales que se dirijan solo a las células visibles. Una variante realmente rápida e indolora es usar offset.
Vea lo siguiente:
Sub CopyFilterResult()
Dim WS1 As Worksheet, WS2 As Worksheet
With ThisWorkbook
Set WS1 = .Sheets("Sheet1")
Set WS2 = .Sheets("Sheet2")
End With
''Apply your filters here.
WS1.UsedRange.Offset(1, 0).Copy WS2.Range("A1")
End Sub
Capturas de pantalla:
Fuente (con filtro):
Resultado:
Algo para mantener como una alternativa.
Haznos saber si esto te ayudó.
EDITAR:
Este código es como intercambio en comentarios. Lea los comentarios y modifíquelos según sus necesidades.
Sub CopyAfterFilterMk2()
Dim WS1 As Worksheet, WS2 As Worksheet
Dim RngBeforeFilter As Range, RngAfterFilter As Range
Dim LCol As Long, LRow As Long
With ThisWorkbook
Set WS1 = .Sheets("Sheet1")
Set WS2 = .Sheets("Sheet2")
End With
With WS1
''Make sure no other filters are active.
.AutoFilterMode = False
''Get the correct boundaries.
LRow = .Range("A" & .Rows.Count).End(xlUp).Row
LCol = .Range("A1").End(xlToRight).Column
''Set the range to filter.
Set RngBeforeFilter = .Range(.Cells(1, 1), .Cells(LRow, LCol))
RngBeforeFilter.Rows(1).AutoFilter Field:=1, Criteria1:="o"
''Set the new range, but use visible cells only.
Set RngAfterFilter = .Range(.Cells(2, 1), .Cells(LRow, LCol)).SpecialCells(xlCellTypeVisible)
''Copy the visible cells from the new range.
RngAfterFilter.Copy WS2.Range("A1")
''Turn off the filter.
.AutoFilterMode = False
End With
End Sub
Este código también maneja múltiples filas después del filtro.
Haznos saber si esto te ayudó.