2013-05-02 2 views
2

У меня есть макрос, который фильтрует электронную таблицу по отделам, а затем копирует &, вставляя результаты в таблицу соответствующих отделов. Затем он повторяется для каждого из 9 отделов. Он отлично работает, за исключением того, что он не копирует и не вставляет последнюю строку данных для раздела «Punch Press». Он показывает выделенные ячейки, но данные не передаются вместе с ним.Почему это пропускает один ряд ячеек?

Любая помощь с благодарностью!

Вот что у меня есть:

Sub UpdateTables() 
    'PunchPress Macro 



    Sheets("Audit scores").Select 
    ActiveSheet.Range("$A$1:$AL$118").AutoFilter Field:=2, Criteria1:= _ 
     "Punch Press ESP" 


    Range("X1").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Range(Selection, Selection.End(xlToRight)).Select 


    Selection.Copy 
    Sheets("Punch Press").Select 
    Range("X1").Select 
    ActiveSheet.Paste 
    Columns("A:A").ColumnWidth = 17.57 
    Columns("A:A").ColumnWidth = 20.57 
    Rows("2:2").RowHeight = 15 
    Selection.RowHeight = 15 

    Range("A1").Select 

End Sub  
+1

Обычно, когда вы фильтруете базовые данные, все еще там. Интересно, копируете ли вы скрытые ячейки. Прошли ли вы через код с помощью отладчика, чтобы увидеть, какой выбор подходит до его копирования? Кроме того, это выглядит как макросъемка, это может пойти намного быстрее, если вы обратились к листам/ячейкам напрямую, вместо использования ActiveSheet, Selection, .Select и Copy.Paste. «Таблицы» («Пунш-пресс»). Диапазон («X1»). Текст = Таблицы («Аудиторские баллы»). Диапазон («X1»). Смещение (1,1) .Текст' ... и что-то вроде , –

ответ

0

В основном вы где использование Range(..) в неправильном порядке. Я полагаю, что вы предполагаете, что этот диапазон должен находиться на активном листе, но это является инстантом. Когда я запускаю это, я получаю сообщение об ошибке.

Я обновляю ваш код для запуска, но без каких-либо улучшений производительности. Ниже я работал для меня.

Sub UpdateTables() 
'PunchPress Macro 

    With Sheets("Audit scores") 
     .AutoFilterMode = False '<~~Remove filters 
     .Range("$A$1:$AL$118").AutoFilter Field:=2, Criteria1:="Punch Press ESP" 
     .Range("X1").Select 
     .Range(Selection, Selection.End(xlDown)).Select 
     .Range(Selection, Selection.End(xlToRight)).Select 
    End With 

    Selection.Copy 

    With Sheets("Punch Press") 
     .Select 
     .Range("X1").Select 
     .Paste 
     .Columns("A:A").ColumnWidth = 17.57 
     .Columns("A:A").ColumnWidth = 20.57 
     .Rows("2:2").RowHeight = 15 
     Selection.RowHeight = 15 
     .Range("A1").Select 
    End With 

End Sub 

Чтобы добавить небольшую оптимизацию к копированию ваших значений. Метод копирования является лучшим, потому что вы отфильтровали лист, но это можно сделать в одной строке. Я также использовал последнюю строку и столбец для использования вместо того, чтобы полагаться на выбор вниз и вправо, поскольку это остановится на пустой ячейке.

Sub UpdateTables() 
'PunchPress Macro 

    Dim rs As Long, cs As Long 

    With Sheets("Audit scores") 
     rs = .Cells.Find("*", , , , xlByColumns, xlPrevious).Row 
     cs = .Cells.Find("*", , , , xlByRows, xlPrevious).Column 
     .AutoFilterMode = False '<~~Remove filters 
     .Range("$A$1:$AL$118").AutoFilter Field:=2, Criteria1:="Punch Press ESP" 
     .Range(.Cells(1, "X"), .Cells(rs, cs)).Copy Sheets("Punch Press").Range("X1") 
    End With 

    With Sheets("Punch Press") 
     .Columns("A:A").ColumnWidth = 20.57 
     .Rows("1:2").RowHeight = 15 
     .Activate 
     .Range("A1").Select 
    End With 

End Sub 

Надеюсь, это поможет.

+0

Я применил оптимизированный код, и он быстрее, но только копирует строку заголовка в новые листы. – meverhart913

+0

Две вещи. 1: Убедитесь, что есть данные этого фильтра. 2: Вам может потребоваться очистить фильтр, а затем применить новый фильтр. – glh

+0

См. Обновленный код. – glh

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