仅传输可见行而不使用.select或.End(xlDown)

当前代码按照我需要的方式过滤数据,但是当它复制到其上时,复制所有内容不仅仅是过滤的数据。 我知道我可以使用.select,然后复制粘贴等工作,但我宁愿避免,如果可能的话。 任何帮助,将不胜感激。

Sub Auto_Filter() Dim RNG As Range Dim Open_Jobs_Report As Worksheet Set Open_Jobs_Report = ThisWorkbook.Sheets("Open Jobs Report") Dim Dashboard As Worksheet Set Dashboard = ThisWorkbook.Sheets("Dashboard") Dim PersonResponsible As Range Dim Violations As Range Dim CLM1 As Long Dim CLM2 As Long With Sheets("Open Jobs Report") Set RNG = .Range("A1", .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column)) RNG.AutoFilter Field:=19, Criteria1:="<>" CLM1 = .Range("1:1").Find(What:="Person Responsible").Column Set PersonResponsible = .Range(.Cells(1, CLM1), .Cells(1, CLM1).End(xlDown)) CLM2 = .Range("1:1").Find(What:="Violations").Column Set Violations = .Range(.Cells(1, CLM2), .Cells(1, CLM2).End(xlDown)) End With Dashboard.Range("B4:B1000").Value = PersonResponsible.Value Dashboard.Range("E4:E1000").Value = Violations.Value Dashboard.Range("B4:B1000").RemoveDuplicates , Header:=xlYes Dashboard.Range("E4:E1000").RemoveDuplicates , Header:=xlYes Open_Jobs_Report.ListObjects(1).AutoFilter.ShowAllData End Sub 

这只会复制Open_Jobs_Report表中表格的可见行

 Open_Jobs_Report.ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy 

更新后的评论:

 With Open_Jobs_Report.ListObjects(1) Union(.ListColumns(9).DataBodyRange, .ListColumns(19).DataBodyRange).Copy End With 

或者使用标题名称:

 With Open_Jobs_Report.ListObjects(1) Union(.ListColumns("Person Responsible").DataBodyRange, .ListColumns("Violations").DataBodyRange).Copy End With 

更多地思考这个问题,我可能会这样做:

 Dim Open_Jobs_Report As Worksheet Dim temp as Variant Set Open_Jobs_Report = ThisWorkbook.Sheets("Open Jobs Report") temp = Open_Jobs_Report.ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Value With Dashboard .Range(.Cells(4, 2), .Cells(3 + UBound(temp,1), 2)).Value = Application.Index(temp, , 9) .Range(.cells(4, 5), .Cells(3 + UBound(temp, 1), 5)).Value = Application.Index(temp, , 19) End With 

这将表的整个可见部分放入内存中的数组,然后设置范围等于您感兴趣的位。

您可能正在使用工作表的内置AutoFilter.Range对象。

 ActiveSheet.AutoFilter.Range.Copy Workbooks.Add.Worksheets(1).Paste 

这个链接给出了完整的解释