1

固有のタグ プロパティによって 1 つのスライドから形状を取得し、それを別のスライドに貼り付けるマクロがあります。

OS のさまざまなバージョン (Win 7、8、8.1) および PowerPoint のバージョン (2007、2010、2013、32 & 64 ビット) で期待どおりに動作します。

しかし、クリップボードが空であるために貼り付けコマンドが失敗するユーザーが1人だけいました。

これは、簡単にするために、形状を返すコード スニペット (ShapeByTag は含めていません) 関数です。

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

2 行目に「-2147188160 Shapes (unknown member) : Invalid request. Clipboard is empty or contains data that may not be pasted here.」というエラーが発生した場合。VBE に入り、コマンドを正常に再実行できます。これは、タイミングの問題があることを示しています。

しかし、ユーザーのマシンは、8GBRAM を搭載した真新しい i5 Windows 8.1 Pro (64 ビット) ラップトップであり、問​​題が発生しない他の多くのユーザー マシンよりも強力です。彼は 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 メソッドは非常に瞬時に実行され、基になる OS がコピー操作を完了するまで次の行は実行されないと予想していました。また、タイマーを追加して、遅延が実際に挿入されている時間を確認します。

4

4 に答える 4

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 に答える