2016-09-15 100 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': 工作表類錯誤的粘貼方法

儘管此代碼不是最乾淨的,除了「粘貼」到Z欄中的「sheetA」上外,它的所有功能都是起作用的。如果可以將其粘貼到AA中,則還需要粘貼到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 As Range' 'Set Adjustment = Worksheets (「Sheet」)。範圍(「DX2:DX」和lastRow)' 然後激活並過濾Sheet A然後這個代碼: 'Range(「Z2:Z」&lastRowTwelve).SpecialCells(xlCellTypeVisible).Value = Adjustment .Value' 這個「粘貼」在正確的列,但被「複製」的數據是不正確的。它忽略了SheetB上的過濾器(在我原來的代碼中,它被正確複製。任何建議? 我繼續嘗試清理.activate和.selection! – RugsKid

+0

我改爲: 'Set Adjustment = Worksheets(「YTD Promo評論「)。範圍(」DX2:DX「和lastRowTen).SpecialCells(xlCellTypeVisible)' 這導致了四個正確的行將」粘貼「到Z列中的SheetA。但是前四個下面的其餘行不是他們說#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,無論可能。

相關問題