Excel 2010范围类的PasteSpecial方法失败



我试图理解为什么某些代码在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个以上的值,我会从主题中得到错误

粘贴范围类的特殊方法失败

根据我的测试,似乎发生了这样的情况:在撤消操作开始之前,Excel会自动将Column1Column2添加到列L和M中,这会导致Target采用"第1列"one_answers"第2列",因此当我尝试在要粘贴的实际值上运行它时,最终会导致错误。如果我将表转换为正常范围,则所有内容都会按预期运行。

我想了解Excel为什么插入"第1列"one_answers"第2列",为什么它只在另一个电子表格的5个以上单元格中出现,以及我如何在代码中解释这一点。

我想了解为什么Excel、会插入"第1列"one_answers"第2列"

当粘贴现有ListObject表附近的数据时,会发生这种情况。

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

该错误的发生似乎是因为Application.Undo正在撤消粘贴操作,从而进一步影响Application.CutCopyMode = False,因此在下一行中,当您尝试使用PasteSpecial方法时,根本无法粘贴任何内容,因为Undo已将其清除。

Pastespecial似乎对它输入的参数非常敏感。

在迁移到Windows 10之前,我遇到了来自代码的完全相同的错误消息。我发现这种参数组合在我的情况下有效:

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

不能声称我找到了参数组合——它来自yatici的自答

尽管有一个变通方法,但亚蒂奇还是回到了最初的问题,并用pastespecial直接解决了这个问题。

最新更新