复制自动过滤范围,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的主要内容,如果未能解决你的问题,请参考以下文章