4

私は現在、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 枚のスライドに対して合理的な時間枠で機能する効率的な「コピー アンド ペースト」スライドに関する提案は他にありますか?

事前に、アイデアをありがとう。

4

2 に答える 2

3

方法2の問題は、私が使用していたことです:

destinationPresentation.CommandBars.ExecuteMso("PasteSourceFormatting")

これはあるべきだったのに対し:

destinationPresentation.Application.CommandBars.ExecuteMso("PasteSourceFormatting")

このコードを使用すると、null pointer exception.

今後同様のエラーを起こす人を支援するために、これを回答として提出しました。

そうは言っても、このアプローチ(方法2)のパフォーマンスは、手動の「フォーマットをコピーして貼り付ける」方法(方法1)よりも大幅に優れているわけではありません。どちらの場合も、「ソース形式で貼り付け」機能を使用した場合のパフォーマンスは、通常の「貼り付け」よりも何倍も遅くなり、約 20 枚のスライド (それぞれ独自のデザイン テンプレートを使用) の貼り付けに約 2 分かかります。「宛先フォーマット」を使用するか、各スライドに個別のデザイン テンプレートがない場合、これは 1 秒未満に短縮されます。

ただし、これは PowerPoint 2010 のパフォーマンスの問題にすぎない可能性があるため、元のクエリのパフォーマンス面により良い解決策を提供する情報が他にない限り、この回答を受け入れます。

于 2013-08-29T07:50:53.647 に答える