【问题标题】:Paste in new sheet after applying filter pastes nothing应用过滤器后粘贴到新工作表中不粘贴任何内容
【发布时间】:2015-10-27 21:21:30
【问题描述】:

我正在尝试运行一个宏,它应该获取最后一个活动行,将所有数据复制到新工作表,应用过滤器(K 行 >15,9 上的数字),将结果复制并粘贴到新的表。

但是,应用过滤器后,新工作表中不会粘贴任何内容。 任何想法为什么?

谢谢!

Sub Macro1()

'Select and paste all data, couldn't work on a "last active line" in here..
Cells.Select
Selection.Copy
Sheets("Plan2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("A1:O1").Select    
Application.CutCopyMode = False

'Aplying the filter
Selection.AutoFilter
ActiveSheet.Range("$A$1:$O$1056").AutoFilter Field:=11, Criteria1:=">15,9" _
    , Operator:=xlAnd

'Here I'm trying to past the filtered data in the new sheet, but the result appears in blank
Cells.Select
Selection.Copy
Sheets("Plan3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

'Here i came back and turned the autofilter off, but it was useless
Sheets("Plan2").Select
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$O$1056").AutoFilter Field:=11
End Sub

【问题讨论】:

  • 你认为这个标准在做什么:">15,9"?
  • 你能不能只过滤第一张纸然后将过滤后的数据粘贴到下一张纸上?
  • 问题可能是 VBA 中的 DecimalSeparator 属性,您可能需要使用 US-EN 样式表示法:>15.9 而不是 >15,9。否则,最有可能的错误来源是不合格的Cells/Range 对象,如下斯科特的回答。
  • 大卫,这不仅仅是小数分隔符,我已经按照你的建议进行了尝试,但问题仍然存在。 ">15,9" 它应该过滤高于 15,9 的数字
  • Davesexcel,这就是问题所在:在宏中,当我过滤第一张工作表并将过滤后的数据粘贴到下一张工作表时,没有粘贴任何内容。手动它可以工作,但在宏中没有。

标签: excel vba


【解决方案1】:

代码中有一些问题:

  1. 使用Cells 可能非常棘手,尤其是当您没有很好地定义它们时
  2. 使用Select 从来都不是一个好习惯。只需坚持直接使用对象(工作表、范围、工作簿等)。
  3. 我不知道您为什么需要将整个数据集复制到新工作表,然后将其过滤以复制到第三张工作表。可以只过滤原始数据集并复制到最终工作表。我没有为此调整代码,因为您可能需要这样做是有原因的,但是您知道,您可以只使用原始数据,而无需复制到另一张表进行过滤的中间步骤。
  4. 您可能需要过滤 15.9 而不是 15,9,即使逗号是您的小数分隔符。 (这可能不是真的,但我会添加它以防万一(我没有在 Excel 中处理欧洲系统的经验。)另外,请参阅上面的 David Zemens 评论。

在下面的代码中,我已经限定了所有工作表和范围,找到了 最后一行,并在我做出一些假设的地方提供了 cmets。修改它以适合您的确切结构,并让我知道它是否有效。

Sub Macro1()

'Select and paste all data, couldn't work on a "last active line" in here..

Dim wsCopy As Worksheet, wsPlan2 As Worksheet, wsPlan3 As Worksheet
Set wsCopy = Sheets("mySheet") ' replace with correct sheet name
Set wsPlan2 = Sheets("Plan2")
Set wsPlan3 = Sheets("Plan3")

'this will copy only cells with data in (*note -> this could copy more than that, but I will not go into it, for now, it's sufficient to use this)
With wsCopy

    'find last row
    Dim lRow As Long
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    .Range("A1:O" & lRow).Copy 'assume the data goes to column O, change if need be

End With

With wsPlan2

    'paste to sheet Plan 2
    .Range("A1").PasteSpecial xlPasteValues

    'find last row
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    With .Range("A1:O" & lRow)
        'Aplying the filter
        .AutoFilter 11, ">15,9" 'you may need to use 15.9 here if you indeed mean 15 and 9/10ths. even if the comma separator is what you use to show decimals
        .Copy
    End With

    wsPlan3.Range("A1").PasteSpecial xlPasteValues 'change range reference if you need it

    .AutoFilterMode = False

End With

End Sub

【讨论】:

  • 嗨@ScottHoltzman,非常感谢您的回答!它看起来比原来的要好得多,我尝试了你的建议,但是当它运行时,代码的第二行突出显示:wsCopy As Worksheet, wsPlan2 As Worksheet, wsPlan3 As Worksheet 并出现此错误消息:compilation error: 'Illegal instruction out of a Type block 你知道问题可能是什么吗?
  • 对不起,我忘记了语法前面的Dim 语句。我已经编辑了我的答案以反映这一点。请再试一次:)
  • 太棒了,现在它可以完美运行了!正如你所说,我只需要将15.9 更改为15,9。非常感谢,你帮了我很多! =)
猜你喜欢
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多