2015-09-03 5 views
3

Я изменил свой макрос Excel, который до этого переходил по строке за строкой, и теперь он фильтрует результаты и копии навалом. Гораздо эффективнее.Excel VBA AutoFilter добавляет пустые строки

Проблема, которую я получаю сейчас, Автофильтр добавляет миллионы пустых строк в рабочий лист, и я не могу определить, почему он это делает.

CountryCodes - это словарь, который содержит значения для фильтра. Критерии ищут строки, содержащие запись из словаря.

Это код:

For Each vall In CountryCodes 
    thisWB.Activate 
    thisWB.Sheets("Overall Numbers").Activate 

    lookfor = CountryCodes.Item(vall) 
    rep = Replace(thisWBName, "EMEA", lookfor) 

    Set rng = ActiveSheet.Range("A1:Z1") 

    FilterField = WorksheetFunction.Match("Host", rng.Rows(1), 0) 

    If ActiveSheet.AutoFilterMode = False Then rng.AutoFilter 

    rng.AutoFilter Field:=FilterField, Criteria1:="=*" & lookfor & "*", Operator:=xlFilterValues 

    Set rng2 = ThisWorkbook.Worksheets("Overall Numbers").Cells.SpecialCells(xlCellTypeVisible) 

    rng2.Copy Workbooks(rep).Worksheets("Overall Numbers").Range("A1") 

    Workbooks(rep).Save 

    thisWB.Activate 
    thisWB.Sheets("Overall Numbers").Activate 

    Cells.AutoFilter 
Next 
+0

Я также попытался добавить фильтр с помощью Excel Filters, и я получаю тот же результат - пустые строки добавляются в конце. Это сводит меня с ума! – Bart

+0

+1 для преобразования петли в автофильтр. Вы должны открыть исходные файлы и удалить все пустые строки, и вы увидите значительное уменьшение размера файла и более высокую производительность при обновлении данных. Выберите первую пустую строку (а не только одну ячейку) и нажмите Shift + Ctrl + стрелку вниз, затем ** не нажимайте клавишу «Удалить» **, вместо этого щелкните правой кнопкой мыши одну из выбранных строк и выберите «Удалить» из всплывающего окна –

ответ

1

Испытано:

Dim ur As Range 
Set ur = ThisWorkbook.Sheets("Overall Numbers").UsedRange 

Application.ScreenUpdating = False 
filterField = Application.Match("Host", ur.Rows(1), 0) 
If Not IsError(filterField) Then 

    For Each vall In countryCodes 
     rep = Replace(thisWBName, "EMEA", vall) 

     ur.AutoFilter Field:=filterField, Criteria1:="=*" & vall & "*" 

     'copy visible rows with data only 
     ur.SpecialCells(xlCellTypeVisible).Copy 

     'paste visible rows with data only 
     Workbooks(rep).Worksheets("Overall Numbers").Range("A1").PasteSpecial xlPasteAll 
     Workbooks(rep).Save 

     ur.AutoFilter 
    Next 
End If 
Application.ScreenUpdating = True 
+0

Пришлось внести некоторые незначительные изменения, но теперь это работает! : D - Спасибо – Bart

+0

Спасибо за отзыв - Я рад, что помог –

1

Я реорганизовал свой код и удалить .Activate зависимость и выделяли отфильтрованные данные с Range.CurrentRegion property.

With thisWB 
    With .Worksheets("Overall Numbers") 
     If .AutoFilterMode Then .AutoFilterMode = False 

     lookfor = CountryCodes.Item(vall) 
     rep = Replace(thisWBName, "EMEA", lookfor) 

     With .Cells(1, 1).CurrentRegion 
      FilterField = WorksheetFunction.Match("Host", .Rows(1), 0) 
      For Each vall In CountryCodes 
       .AutoFilter Field:=FilterField, Criteria1:="=*" & lookfor & "*", Operator:=xlFilterValues 
       If CBool(Application.Subtotal(103, .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0))) Then 
        .Copy Workbooks(rep).Worksheets("Overall Numbers").Range("A1") 
        Workbooks(rep).Save 
       End If 
       .AutoFilter Field:=FilterField 
      Next vall 
     End With 
    End With 
    .AutoFilter 
End With 

Если rep не какое-то образом увеличивается, это, кажется, вставить в тот же рабочей книге/лист/диапазон для каждой итерации.

+0

Работает тоже! - Благодаря! : D – Bart

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