【问题标题】:Excel 2010 PasteSpecial method of range class failed范围类的 Excel 2010 PasteSpecial 方法失败
【发布时间】:2015-11-30 04:48:56
【问题描述】:

我试图了解为什么某些代码在 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 采用“Column1”和“ Column2",因此当我尝试在我要粘贴的实际值上运行它时最终导致错误。如果我将表格转换为正常范围,一切似乎都按预期运行。

我想了解为什么 Excel 会插入“Column1”和“Column2”,为什么它只会出现在另一个电子表格中的 5+ 个单元格中并发出,以及我如何能够在我的代码中解释这一点。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

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

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

    错误似乎是因为Application.Undo 正在撤消粘贴操作并且进一步影响Application.CutCopyMode = False,所以当您尝试使用PasteSpecial 方法的下一行时,只需没有什么可以粘贴的,因为Undo已经清除了。

    【讨论】:

    • 由于这只是几百行代码的一小部分,我意识到我没有提到我确实禁用了事件和屏幕更新。我有一个功能可以打开和关闭这两个功能,但只是为了测试我将其注释掉,在我的代码顶部添加了Application.EnableEvents = False 并得到完全相同的错误。
    • 您最好添加一个按钮以完全通过 VBA 执行粘贴操作,而不是尝试将其捕获为事件。
    • 这解释了正在发生的事情以及原因,现在为了我自己的启发,我想知道是否有某种方法可以覆盖这种行为,以防它以后变得有用。当时,我主要将表格用作为交替行提供阴影的便捷方式,因此如果它会成为问题,我可以不用它。
    • 您要覆盖哪些特定行为?是自动插入表格列标题,还是Undo清空剪贴板?
    • 没有一种简单的方法可以做到前者(即,没有内置方法可以做到这一点,尽管您可以开发一些复杂的逻辑来测试现有 ListObject 表的“邻接”。 ..) 而后者可能根本不可能。如果他们回答了问题/解决了问题,请记住将答案标记为“已接受”。干杯。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2010-12-04
      相关资源
      最近更新 更多