自动过滤,复制列,在另一个电子表格中的第一个打开的单元格中选择“粘贴特殊”(仅限值)

时间:2014-04-23 17:04:56

标签: excel vba excel-vba autofilter

我正在开展一个大型项目并遇到了意想不到的困难。我不认为我需要这么复杂的代码,但我确实如此。我已经剪切并粘贴了我认为需要的代码片段,但是在尝试运行时我一直遇到错误。到目前为止,这是我所拥有的,我知道相当多的缺失。我将发布到目前为止的代码,看看是否有人可以帮我找到缺少的部分。我希望我对代码的意图是明确的:

自动过滤,从过滤后的数据中复制列,然后在B列的第一个打开的单元格中粘贴“常规级别”表格,然后基于B列我有一个A列的自动填充公式。

Sub PullNewstsfromMPtoGL()

Sheets("Master Placement").Range("$A$1:$AX999999").AutoFilter Field:=6, Criteria1:="N"

Sheets("Master Placement").Range("A:I,AA:AC,AN:AQ").Copy

Sheets("General Level").Select
Range("B1").End(xlDown).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False

Dim lastRow As Long
lastRow = Range("B" & Rows.Count).End(xlUp).Row
Range("A2").AutoFill Destination:=Range("A2:A" & lastRow)

1 个答案:

答案 0 :(得分:0)

我认为这里可能有不止一个问题。您收到错误的原因是,即使复制的单元格为空,也无法将任何内容粘贴到超出目标工作表边界的单元格中。但是,运行初始发布代码的错误是: 1004 Copy and paste areas are not the same size and shape

复制已过滤的列时,复制的行数将是已过滤列表中的行数加上空行数。解决方法是将复制的范围缩小到最小值捕获所有数据的行数(这也会加快代码速度)。

因此,定义要在复制操作中使用的LastRow变量。修改后的代码如下:

Sub PullNewstsfromMPtoGL()
Dim LastRow As Long

Sheets("Master Placement").Range("$A$1:$AX999999").AutoFilter Field:=6, Criteria1:="N"
LastRow = Range("B" & Rows.Count).End(xlUp).Row
'Assuming row 1 has headings otherwise change 2s to 1s
Sheets("Master Placement").Range("A2:I" & LastRow _
    & ",AA2:AC" & LastRow _
    & ",AN2:AQ" & LastRow).Copy
With Sheets("General Level")
'No need to select paste range
    .Range("B1").End(xlDown).Offset(1, 0).PasteSpecial _
        Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    LastRow = .Range("B" & Rows.Count).End(xlUp).Row
    .Range("A2").AutoFill Destination:=.Range("A2:A" & LastRow)
End With
'Optional - clear filter from Master Placement
Sheets("Master Placement").Range("$A$1:$AX999999").AutoFilter Field:=6
End Sub

我无法重现PasteSpecial method of Range class failed错误,但我通常将其与没有要粘贴的内容相关联。选择单元格不会清除剪贴板,但会编辑或清除过滤器。你在你的OP中说过

  

我剪切并粘贴了我认为需要的代码片段

所以我想知道是否有一行未复制的代码可以清除剪贴板?