Excel 2010范围类的PasteSpecial方法失败

时间:2015-02-24 19:48:22

标签: excel vba excel-vba

我试图理解为什么某些代码在Excel 2010中不起作用。

我有一个文件,其中单元格A1:K200是表格的一部分(“格式为表格”选项形成“主页”选项卡),但第2-13行被隐藏用于数据验证组合框。标题行和行绑定选项已启用。我想要做的是复制(通过用户按下Ctrl-C)并粘贴(通过用户按下Ctrl-V)来自另一个工作簿的数据,然后在Worksheet_Change中设置一个宏功能来转置数据(基于工作表上复选框的值)并仅粘贴值。列A-H将填写其他数据。

我已禁用事件和屏幕更新,为单元格I14:I200设置范围作为交叉函数的StdCost,然后使用以下代码捕获对上述范围的更改。 optTranspose是我放在工作表上的复选框,Target是由Excel设置的变量,是Worksheet_Change函数的一部分。

If Not Application.Intersect(Target, StdCost) Is Nothing Then
    If Application.CutCopyMode = xlCopy Then
        Application.Undo
        .Range("I" & Target.Row).PasteSpecial Paste:=xlPasteValues, Transpose:=optTranspose
    End If
End If

上面的代码可以使用,但根据我的测试,它只能在最多粘贴4个值的情况下工作,如果我从第15行开始粘贴,它将起作用。但是,如果我粘贴5个以上的值,我会收到主题中的错误

  

范围类的PasteSpecial方法失败

根据我的测试,似乎发生的情况是,在撤消操作开始之前,Excel会自动将Column1Column2添加到列L和M,然后导致Target占用on" Column1"和#34; Column2"因此,当我尝试在我想要粘贴的实际值上运行它时,最终会导致错误。如果我将表转换为正常范围,一切似乎都按预期运行。

我想了解为什么" Column1"和#34; Column2" Excel正在插入,为什么它只是来自另一个电子表格中的5个以上的单元格,它变成了问题,以及我如何能够在我的代码中解释这一点。

2 个答案:

答案 0 :(得分:0)

  

我想了解Excel为什么插入“Column1”和“Column2”,

将数据粘贴到现有ListObject表旁边时会发生这种情况。

发生更改事件(即,您“粘贴”数据),工作表更改,然后Worksheet_Change事件将触发。

错误似乎发生,因为Application.Undo正在撤消粘贴操作进一步影响Application.CutCopyMode = False,所以当您尝试使用{{1时<}方法,没有任何东西可以粘贴,因为PasteSpecial已经清除了它。

答案 1 :(得分:-1)

Pastespecial似乎对它所喂食的参数非常敏感。

我在迁移到Windows 10之前的代码中遇到了完全相同的错误消息。我发现这种参数组合适用于我的情况:

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

不能声称我发现了参数的组合 - 它来自yactici's self answer

尽管有一个解决方法并直接使用pastespecial解决问题,但感谢yactici回到他最初的问题。