1

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

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

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

为简单起见,这是返回形状的代码片段(我没有包含 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 来查看实际注入了多长时间的延迟。

4

4 回答 4

0

oshp 是否声明为形状?

Shapes.Paste 返回一个 ShapeRange

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

于 2014-05-07T10:42:12.970 回答
0

除了 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
于 2014-05-07T14:24:07.970 回答
0

DoEvents值得一试:

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

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

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

于 2014-05-07T11:57:42.553 回答
0

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

ActiveWindow.View.GotoSlide (osld.SlideIndex)
On Error Resume Next
Set oShp = Nothing
While oShp Is Nothing
Set oShp = osld.Shapes.Paste
Wend
于 2014-05-07T13:17:47.590 回答