私は現在、Scriptom を使用して Groovy でいくつかの PowerPoint 2010 機能を自動化していますが、この問題は PowerPoint 自動化アプローチに一般的なものかもしれません (つまり、私が使用している特定の環境よりも「VBA マクロ」の問題ですか?)。
(Scriptom では、Groovy から ActiveX または COM Windows コンポーネントを使用できます。内部では、Jacob ライブラリ (Java COM Bridge) を使用していると思います。基になるコードは、VBA マクロまたは他の Microsoft オートメーションで使用するものと似ています。コンポーネントであり、PowerPoint 2010 オブジェクト API に基づいています)。
私の現在のコードはうまく機能し、PowerPoint を目に見えるように開き、さまざまな機能を実行します。ただし、あるドキュメントから別のドキュメントにスライドを「コピーして貼り付ける」コンポーネントを除き、「ソースの書式を維持します」。
このコピーと貼り付けの手順を 2 回試みましたが、どちらも別の問題につながりました。これらの問題のいずれか (または両方?) を解決することを考えている人がいるのだろうか?
方法 1: 基本的な「コピー」と「貼り付け」の方法を使用します。これは、さまざまな方法で提案されています。
sourceSlide.Copy()
destinationSlide = destinationPresentation.Slides.Paste(slideIndex+i-1)
destinationSlide.Design = sourceSlide.Design
destinationSlide.ColorScheme = sourceSlide.ColorScheme
destinationSlide.FollowMasterBackground = sourceSlide.FollowMasterBackground
... and so on copying formats...
つまり、スライドの書式設定を維持するために、すべての書式を手動でコピーします。これは PowerPoint 2010 より前に使用されていた方法です。私は実際にこれを機能させましたが、フォーマットをコピーするには、「ソース」スライドパックの各スライドをループし、上記のコピー/貼り付けコードを実行します。このループでは、次の行 (単独) に問題があります。
destinationSlide.Design = sourceSlide.Design
目的の SlidePack の SlideMaster に多数の「デザイン」があると、この行の実行速度は非常に遅くなります。19 枚のスライドのソース スライド パックをコピーしています。それぞれのスライドには、異なる SlideMaster デザイン テーマがあります (これが私の思いつきです)。この 1 行のコードは、最初のスライドをコピーするのに約 0.01 秒かかりますが、ループの最後のスライドになるまでには、1 行のコードを毎回実行するのに 20 秒以上かかります。したがって、最初の 5 枚のスライドのコピーには 1 秒未満かかる場合がありますが、合計 20 枚のスライドのコピーには合計で約 100 秒かかり、最後のすべてのスライドでは、この 1 行だけを実行するのにますます時間がかかります。残りのコード競争は過ぎ去っていきます!
スローダウンは直線的ではなく、20 枚のスライドを超えるとさらに悪化します。最終スライドのコンテンツとは関係ありませんが、SlideMaster の「デザイン/テーマ」の数が増えると、「sourceSlide.Design」全体のコピーが指数関数的に遅くなるようです。スライドごとに異なる「デザイン」オブジェクトを使用するのは少しもったいないことだと思いますが、私は最初のソース プレゼンテーションを所有していないため、各スライドのデザインがわずかに異なるだけで、このように表示されることがよくあります。 . 「destinationSlide.Design」行を削除すると、所要時間が 100 秒以上から約 1 秒に短縮されます。
方法 2: これを回避するために、PowerPoint 2010 を使用しているため、代わりに次のコードを使用しようとしました。
sourceSlide.Copy()
def destinationPresentation = objPpt.Presentations.Open(destinationFilename)
destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting")
これにより、PowerPoint 2010 の「ソース形式で貼り付け」機能に直接アクセスできるようになるはずです。ただし、これnull pointer exception
は行に " " で失敗しますExecuteMso("PasteSourceFormatting")
。
私は何を間違っていますか?方法 1 で遅い回線を高速化する方法はありますか? 方法 2 がまったく機能しないのはなぜですか? 「destinationPresentation.CommandBars」は null ではないように見えますが、「ExecuteMso」行は null ポインター例外をスローします。
複数の異なるデザイン/テーマがある場合でも、20 ~ 100 枚のスライドに対して合理的な時間枠で機能する効率的な「コピー アンド ペースト」スライドに関する提案は他にありますか?
事前に、アイデアをありがとう。