复制自动过滤范围,vba excel

Posted

技术标签:

【中文标题】复制自动过滤范围,vba excel【英文标题】:Copy autofiltered range, vba excel 【发布时间】:2013-09-17 18:17:25 【问题描述】:

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

    对选定workbook 中的特定sheet 应用自动过滤器 将数据从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 

但是,宏会持续复制一些垃圾。这意味着除了autofiltered range 之外,它还从每个sheet 前三个rows 复制。

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

编辑

这是工作表中数据的示例

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

【问题讨论】:

【参考方案1】:

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

您在 Intersect...Copy 语句中使用的 Offset 应该是您要忽略的自动过滤结果上方的行数,而不是值 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

【讨论】:

感谢您的回复。关于Offset,我需要从选定范围中删除标题,这就是我使用值1的原因。你建议什么而不是.UsedRange 您仍然可以使用UsedRange,只需将您的偏移值增大到足以使自动过滤数据上方的行不包括在内。 这有点问题,因为我不知道所选范围上方有多少行 =) @fsua,是的,我现在明白了。您正在过滤整个工作表内容,包括几行(未指定)标题数据。您将需要知道您有多少行标题数据,或者如果您的数据始终采用特定的样式或格式,您可以编写代码来尝试检测第一行好的数据,这样您就知道数据从哪里开始. 假设,我知道我的数据头中有多少行(比如 5),那么你能建议我应该写什么代码吗?

以上是关于复制自动过滤范围,vba excel的主要内容,如果未能解决你的问题,请参考以下文章

如何自动填充公式 VBA

Excel VBA自动筛选器会继续删除与条件不匹配的数据

使用 Excel VBA 实现复制 粘贴 和保存,并自动运行VBA

EXCEL VBA 不完全匹配自动过滤器

Excel VBA:自动填充动态范围错误

VBA Excel - 自动填充方法超出范围类错误