3

我编写了执行以下操作的代码:

  1. 将自动过滤器应用于sheet所选中的特定workbook
  2. autofiltered range将数据从除了标头之外的另一个复制到另一个workbook

这是代码:

 m = 2 
 For i = 1 To work_book.Worksheets.Count 
With work_book.Sheets(i) 
    If (.UsedRange.Rows.Count > 1) Then 
         'apply filters
        .UsedRange.AutoFilter field:=2, Criteria1:=array_of_account_numbers, Operator:=xlFilterValues 
        .UsedRange.AutoFilter field:=1, Criteria1:=array_of_debit_or_credits, Operator:=xlFilterValues 
         'select only visible cells after autofilter is applied
        On Error Goto a 
        m = destination_workbook.Sheets(1).UsedRange.Rows.Count + 1 
        Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(xlCellTypeVisible).Copy destination_workbook.Sheets(1).Range("A" & m) 
 a: 
    End If 
   End With 

但是,宏会持续复制一些垃圾。这意味着它除了从前sheet三个复制。rowsautofiltered range

我该如何解决这个问题?我将感谢您的帮助和回答。

编辑

这是工作表中数据的示例

数据示例

过滤器应用于 Criteria1 (<> 60, <>50) 和 Criteria2 (<>1470, <>1450)

4

1 回答 1

1

.UsedRange将获取源工作表上的所有数据,而不仅仅是自动过滤结果下方的数据。

Offset您在语句中使用的应该Intersect...Copy是您要忽略的自动过滤结果上方的行数,而不是值 1。

如果您知道您有多少标题行:

numHeaderRows = 5
For i = 1 To work_book.Worksheets.Count 
  With work_book.Sheets(i) 
    If (.UsedRange.Rows.Count > 1) Then 
         'apply auto-filters starting at the row directly above the start of the data.
        .UsedRange.Offset(numHeaderRows-1).AutoFilter field:=2, Criteria1:=array_of_account_numbers, Operator:=xlFilterValues 
        .UsedRange.Offset(numHeaderRows-1).AutoFilter field:=1, Criteria1:=array_of_debit_or_credits, Operator:=xlFilterValues 
         'select only visible cells after autofilter is applied
        On Error Goto a 
        m = destination_workbook.Sheets(1).UsedRange.Rows.Count + 1 
        Intersect(.UsedRange, .UsedRange.Offset(numHeaderRows)).SpecialCells(xlCellTypeVisible).Copy destination_workbook.Sheets(1).Range("A" & m) 
  a: 
    End If 
  End With
Next
于 2013-09-17T19:25:39.720 回答