2016-09-15 3 views
0

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

Worksheets("SheetB").Select 

lastRowOne = Range("B" & Rows.Count).End(xlUp).Row 
Range("DL2:DL" & lastRowOne).AutoFilter Field:=116, Criteria1:="<>Apples" 



lastRowTwo = Range("B" & Rows.Count).End(xlUp).Row 
Range("DG2:DG" & lastRowTwo).AutoFilter Field:=111, Criteria1:=Target 

'Target is already defined earlier in the Macro and functions fine 


lastRowThree = Range("B" & Rows.Count).End(xlUp).Row 
Range("DX2:DX" & lastRowThree).Copy 


Worksheets("SheetA").Activate 


lastRowFour = Range("B" & Rows.Count).End(xlUp).Row 
Range("A2:A" & lastRowFour).AutoFilter Field:=1, Criteria1:=Target 


lastRowFive = Range("B" & Rows.Count).End(xlUp).Row 

Range("Z2:Z" & lastRowFive).SpecialCells(xlCellTypeVisible).Select 

Selection.PasteSpecial Paste:=xlPasteRange, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

вместо последней строки я также пытался:

ActiveSheet.Paste 

Первые Возвращает «Ошибка выполнения„1004“: PasteSpecial метод класса диапазона не удалось

в ActiveSheet.Paste возвращает «Ошибка времени выполнения» 1004: Не удалось выполнить метод вставки класса Worksheet

Хотя этот код не самый чистый , все это работает, за исключением «вставки» на «sheetA» в столбце Z. Мне также нужны данные, вставленные в AA, если они могут быть включены в исправление.

Спасибо!

+0

У меня есть подозрение, что это связано с использованием вами '.Select' /' .Activate'. Использовать их не рекомендуется - вы хотите [избегать использования '.Select' /' .Activate'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel- vba-macros), как вы можете видеть, это может вызвать некоторые ошибки. Я *** очень *** предлагаю прочитать эту страницу и применить ее. Если вы все еще получаете ошибки, сообщите нам об этом. Особенно при переключении между листами, использование '.Activate', скорее всего, не удастся. – BruceWayne

+0

@BruceWayne Спасибо - я изменил мой макрос использовать: 'lastRow = Range ("B" & Rows.Count) .END (xlUp) .Row' ' Dim Adjustment Как Range' «Set Adjustment = Таблицы («Лист»). Диапазон («DX2: DX» & lastRow) ' Затем активированный и отфильтрованный лист A, затем этот код: 'Диапазон (« Z2: Z »& lastRowTwelve) .SpecialCells (xlCellTypeVisible) .Value = Adjustment .Value' Это «вставлено» в правильной колонке, но данные, которые были «скопированы», были неверными. Он игнорировал фильтры на SheetB (в моем исходном коде, который он копировал правильно. Любые предложения? Я продолжаю пытаться очистить .activate и .selection! – RugsKid

+0

Я изменил на: 'Set Adjustment = Worksheets (« YTD Promo Обзор («DX2: DX» и lastRowTen) .SpecialCells (xlCellTypeVisible) ' Это привело к тому, что четыре правильные строки принесли« вставленные »в SheetA в столбце Z. Но остальные строки ниже четырех верхних не являются Правильно. # N/A – RugsKid

ответ

0

Здесь (я надеюсь) тот же макрос, но без .Select/.Activate, и небольшая настройка. Например, вам не нужно больше одной переменной «lastRow». Поскольку вы действительно просто перезагрузите его, вы можете использовать его.

Sub tester() 
' First create, then SET, worksheet variables to hold the sheets. We use these when 
' referring to ranges, cells, etc. 
Dim aWS As Worksheet, bWS As Worksheet 
Set aWS = Worksheets("SheetA") 
Set bWS = Worksheets("SheetB") 

Dim lastRow As Long 'AFAICT, you only need this one Last Row variable. Just update it each time. 
Dim copyRng As Range 

With wsB ' working with SheetA 
    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 
    .Range("DL2:DL" & lrOne).AutoFilter Field:=116, Criteria1:="<>Apples" 

    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 
    .Range("DG2:DG" & lastRow).AutoFilter Field:=111, Criteria1:=Target 

    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 
    ' We now SET the range we want to copy. We can avoid copy/paste by setting two ranges equal 
    ' to eachother. For now, let's store the COPY RANGE in a Range variable 
    Set copyRng = .Range("DX2:DX" & lastRow).SpecialCells(xlCellTypeVisible) 

End With 'bWS 

Dim pasteRng As Range 
With aWS 
    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 
    .Range("A2:A" & lastRow).AutoFilter Field:=1, Criteria1:=Target 

    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 
    Set pasteRng = .Range("Z2:Z" & lastRow).SpecialCells(xlCellTypeVisible) 
End With 'aWS 

pasteRng.Value = copyRng.Value 

End Sub 

Единственное сомнение у меня есть вставка в SpecialCells. AFAIK, если диапазон пасты отличается от диапазона копирования, вы можете получить некоторые ошибки. В любом случае, попробуйте приведенное выше и сообщите мне, что произойдет.

Важная вещь, чтобы обратить внимание на, особенно при использовании нескольких листов, является то, что вы должны быть явным, с которой лист вы хотите получить Range(), Cells(), Rows(), Columns() и др. В противном случае он получит эту информацию. от ActiveSheet, что бы это ни было.