【问题标题】:How long does it take the VBA .Copy method to populate the clipboard in PowerPoint?VBA .Copy 方法在 PowerPoint 中填充剪贴板需要多长时间?
【发布时间】:2014-06-24 03:43:37
【问题描述】:

我有一个宏,它通过其独特的标签属性从一张幻灯片中获取一个形状,然后将其粘贴到另一张幻灯片上。

它可以在许多不同版本的操作系统(Win 7、8、8.1)和 PowerPoint 版本(2007、2010、2013、32 和 64 位)上按预期工作。

但是,我只有一个用户,由于剪贴板为空,粘贴命令失败。

为了简单起见,这是返回形状的代码 sn-p(我没有包含 ShapeByTag)函数:

Dim oShp as ShapeRange 
ShapeByTag(TagName, TagValue).Copy
Set oShp = oSld.Shapes.Paste

当第二行出现错误“-2147188160 Shapes (unknown member) : Invalid request. Clipboard is empty or contains data which may not be paste here.”我可以进入VBE并成功重新运行命令,提示我有时间问题。

但用户的机器是全新的 i5 Windows 8.1 Pro(64 位)笔记本电脑,配备 8GBRAM,比许多其他没有出现问题的用户机器更强大。他正在使用 PowerPoint 2013 32 位。

我可以通过这样做来解决这个问题:

Dim oShp as ShapeRange
ShapeByTag(TagName, TagValue).Copy
On Error Resume Next
RetryPaste:
Set oShp = oSld.Shapes.Paste
If Err <> 0 Then Err.Clear: GoTo RetryPaste
On Error Goto 0

但是为什么首先会发生错误?我本来预计 .Copy 方法会非常即时,并且在底层操作系统完成复制操作之前不会执行以下行。我还将添加一个 Timer 来查看实际注入的延迟时间。

【问题讨论】:

    标签: vba copy-paste powerpoint powerpoint-2013


    【解决方案1】:

    oshp 是否被声明为 Shape??

    Shapes.Paste 返回一个 ShapeRange

    看不出这将如何导致您的特定错误值得一试。

    【讨论】:

    • 我刚回到帖子添加了那个声明,看到了你的评论约翰。是的,它被声明为 ShapeRange(如果声明为 Shape,由于错误 13,我的解决方法中会出现无限循环)。
    • 从未见过,但可能要确保要粘贴的幻灯片处于活动状态,并且现在可能存在检查 oshp 的循环??
    【解决方案2】:

    DoEvents值得一试:

    ShapeByTag(TagName, TagValue).Copy
    DoEvents
    Set oShp = oSld.Shapes.Paste
    

    DoEvents 将控制权交给操作系统。在操作系统完成处理其队列中的事件后返回控制 [...]

    比如,也许,填充剪贴板?还没有测试过,但对我来说似乎是合理的。

    【讨论】:

    • 哦,我忘了试试 Jean-François。将尝试并报告回来。我仍然对它如何在如此指定的全新机器上出错感到困惑:-(
    • 对,刚刚在远程会话上测试了 DoEvents,奇怪的是它没有修复它。有趣的是,我编写了一个测试宏来将形状从幻灯片 1 复制到幻灯片 2、20 次,并设置了一个非常基本的 VBA 计时器(不是 WinAPI 计时器)来了解重试尝试需要多长时间,这是任何事情在 0 到 0.2 秒之间,每次我运行宏,结果都非常不同!我最初的修复也不起作用,直到我将 RetryPaste 标签移到 Copy 方法之前。
    【解决方案3】:

    从未见过这种情况,但可能要确保您要粘贴到的幻灯片处于活动状态并添加一个循环以检查 oshp 是否已创建。

    ActiveWindow.View.GotoSlide (osld.SlideIndex)
    On Error Resume Next
    Set oShp = Nothing
    While oShp Is Nothing
    Set oShp = osld.Shapes.Paste
    Wend
    

    【讨论】:

      【解决方案4】:

      除了 John 的建议之外,您可能还需要确保确实正在复制某个形状:

      Dim oShp as ShapeRange 
      Dim oSh as Shape
      Set oSh = ShapeByTag(TagName, TagValue)
      If not oSh is nothing then
         ' You know that ShapeByTag returned a reference to a shape 
         ' Continue with your existing code:
         oSh.Copy
         ' etc
      End if
      

      【讨论】:

        猜你喜欢
        • 2019-12-20
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        相关资源
        最近更新 更多