PowerPointを非表示でオートメーションする
Visual C# .NETでPowerPointをオートメーションする必要が出ました。
ところがアプリケーションウィンドウを非表示にできず困ったので、その顛末です。
○
まあ、概ね以下のようなコードでプレゼンテーションファイルを開くんですが、
PowerPoint.Application objApp;
PowerPoint.Presentations objPresSet;
PowerPoint._Presentation objPres;
objApp = new PowerPoint.Application();
objApp.Visible = MsoTriState.msoTrue;
objPresSet = objApp.Presentations;
objPres = objPresSet.Open(path, MsoTriState.msoTrue,
? MsoTriState.msoTrue, MsoTriState.msoTrue);
objApp.Visible を Falseにすると、次のエラーが出てしまいます。
System.Runtime.InteropServices.COMException (0×80048240): Application (不明なメンバー):無効な要求です。アプリケーションウィンドウを非表示することはできません。
それで、ネットを検索してみたのですが、PowerPointのオートメーションなんてあまり流行ってなくて、Excelに比べて情報量が圧倒的に少なく困りました。
ようやく見つけたがVB.NETのFAQで、Openの引数WithWindowsをFalseにすればOKとありました。
しかし、C#でそれをやっても依然と同じエラーとなります。さて、困った。
○
条件を変えてさらにググってみたところ、NamazuのFAQにたどり着きました。
Application.Visible : 無効な要求です。アプリケーションウィンドウを非表示に設定することはできません。
の例外が起きます。ところが、この例外メッセージが出てもインデックスは正常に作成されるようです。ということで、この例外メッセージを nul に送って無視してやれば、うまくインデックスできるようになります
なるほど?ってことで・・・
PowerPoint.Application objApp; PowerPoint.Presentations objPresSet; PowerPoint._Presentation objPres; objApp = new PowerPoint.Application(); try { objApp.Visible = MsoTriState.msoFalse; } catch (Exception e) { //エラーを無視 } objPresSet = objApp.Presentations; objPres = objPresSet.Open(path, MsoTriState.msoTrue, ? MsoTriState.msoTrue, MsoTriState.msoFalse);
こんなんで、いいんでしょうか(汗
