VBA . copy方法在PowerPoint中填充剪贴板需要多长时间?



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

它可以在许多不同版本的操作系统(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形状(未知成员):无效请求。剪贴板为空或包含可能未粘贴在此处的数据。"我可以进入VBE并成功地重新运行命令,这表明有时间问题。

但是用户的机器是一台全新的i5 Windows 8.1 Pro(64位)笔记本电脑,8gb内存,比许多其他用户的机器更强大,没有出现这个问题。他使用的是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来查看实际注入的延迟时间。

oshp是否声明为Shape??

形状。粘贴返回一个ShapeRange

看不出这将如何导致您的特定错误,但值得检查。

DoEvents值得一试:

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

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

,比如填充剪贴板?我还没测试过,但我觉得很合理。

从未见过这种情况,但也许要确保您要粘贴的幻灯片是活动的,并添加一个循环来检查oshp是否已创建

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

除了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

最新更新