2016-09-15 96 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,无论可能。

相关问题