【问题标题】:How to Paste a Range onto another worksheet with filters on如何将范围粘贴到另一个带有过滤器的工作表上
【发布时间】:2017-01-23 15:17:40
【问题描述】:

这似乎是一项简单的任务,但我不断遇到各种错误。我需要过滤工作表 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 类的粘贴方法失败

虽然这段代码不是最干净的,但除了“粘贴”到 Z 列中的“sheetA”上之外,它所有的功能都可以。如果可以将其包含在修复中,我还需要粘贴到 AA 中的数据。

谢谢!

【问题讨论】:

  • 我有一种预感,是因为你使用了.Select/.Activate。使用这些不是最佳实践——你想avoid using .Select/.Activate,你可以看到它会抛出一些错误。我高度建议通读该页面并应用它。如果您仍然遇到错误,请告诉我们。尤其是在工作表之间切换时,使用.Activate 可能会失败。
  • @BruceWayne 谢谢——我修改了我的宏以使用:lastRow = Range("B" &amp; Rows.Count).End(xlUp).RowDim Adjustment As Range'Set Adjustment = Worksheets("Sheet").Range("DX2:DX" & lastRow)' 然后激活并过滤工作表 A,然后输入以下代码:Range("Z2:Z" &amp; lastRowTwelve).SpecialCells(xlCellTypeVisible).Value = Adjustment.Value 这“粘贴”在正确的列中,但“复制”的数据不正确。它忽略了 SheetB 上的过滤器(在我的原始代码中它正确复制。有什么建议吗?我正在继续尝试清理 .activate 和 .selection!
  • 我改为:Set Adjustment = Worksheets("YTD Promo Review").Range("DX2:DX" &amp; lastRowTen).SpecialCells(xlCellTypeVisible) 这导致四行正确的行将“粘贴”到 Z 列中的 SheetA。但前四行以下的其余行不正确。他们说#N/A
  • @BruceWayne 谢谢你的帮助。您发布的代码运行没有错误,但“粘贴的数据”不正确。它从工作表 B 上的正确列中提取,但行不正确。它是从列顶部“复制”,而不仅仅是可见单元格(来自过滤器)。我将:Set copyRng = .Range("DX2:DX" &amp; lastRow) 更改为:Set copyRng = .Range("DX2:DX" &amp; lastRowLast).SpecialCells(xlCellTypeVisible) 这正确“复制”并“粘贴”了前四行,但其余行现在包含 #N/A - 只是作为一个值 - 其中没有公式。有什么想法吗?
  • 不看数据就很难判断,尤其是在添加过滤器时。这两个范围肯定相等吗?在复制之前,请查看copyRng,看看是否有任何原因可能使单元格成为/变成#N/A。这些公式是我假设您将值粘贴到另一张表吗?如果可以,我建议手动执行这部分步骤,并打开宏记录器。因此,复制您的范围,将其作为值粘贴到另一张纸上。然后查看生成的代码,并检查是否有任何#N/A 单元格。 (PS:在回复我的答案时,请在该答案下发表评论)

标签: excel macros runtime-error paste worksheet


【解决方案1】:

这是(我希望)相同的宏,但没有.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,不管是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多