2013-09-17 4 views
3

Я написал код, который делает следующее:Копировать autofiltered диапазона, VBA первенствует

  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 первые три rows в дополнение к autofiltered range.

Как я могу решить эту проблему? Буду признателен за вашу помощь и ваши ответы.

РЕДАКТИРОВАТЬ

Вот пример данных в листе

example of data

фильтр применяется к факторам1 (<> 60, <> 50) и Criteria2 (<> 1470, < > 1450)

ответ

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 
+0

Благодарим за внимание. О 'Offset', мне нужно удалить заголовок из выбранного диапазона, поэтому я использовал значение 1. Что вы предлагаете вместо' .UsedRange'? – fsua

+0

Вы все еще можете использовать 'UsedRange', просто увеличьте значение Offset, чтобы строки, находящиеся выше данных с автоматической фильтрацией, не были включены. – Stewbob

+0

Это своего рода проблема, потому что я не так много строк выше выбранного диапазона =) – fsua

Смежные вопросы