空談録

世界で5人くらいに役立ちたい

C#でWordのNewDocumentイベントを利用する

最近はWordなんて嫌いだ業をしています

さて、Microsoft WordのApplicationClassを使って新しい文書を作成したときに何かしたいとします
Excelの経験をもとにApplicationClass.NewDocumentだろうと推測できますね
するとオブジェクトブラウザにとても愉快な表示が待っています

public virtual Microsoft.Office.Core.NewFile NewDocument { get; }
Microsoft.Office.Interop.Word.ApplicationClass のメンバー

event Microsoft.Office.Interop.Word.ApplicationEvents4_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents4_Event のメンバー

event Microsoft.Office.Interop.Word.ApplicationEvents2_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents2_Event のメンバー

event Microsoft.Office.Interop.Word.ApplicationEvents3_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents3_Event のメンバー

この際なので同名のプロパティがいることは気にしないでおきます

ところでこれで次のようなコードを書いても動きません

this.Application.NewDocument += (d) => MessageBox.Show("NewDocument Test");

このときのエラーメッセージは次の通り

エラー 1 'Microsoft.Office.Interop.Word._Application.NewDocument' と 'Microsoft.Office.Interop.Word.ApplicationEvents4_Event.NewDocument' 間があいまいです。

エラー 2 プロパティまたはインデクサー 'Microsoft.Office.Interop.Word._Application.NewDocument' は読み取り専用なので、割り当てることはできません。

エラー 3 演算子 '+=' を 'Microsoft.Office.Core.NewFile' と 'ラムダ式' 型のオペランドに適用することはできません。

エラー 4 ラムダ式 はデリゲート型ではないため、型 'Microsoft.Office.Core.NewFile' に変換できません。

どうもイベントとプロパティどっちの話してんだよっていうエラー出てますね
当然Reflectionすればイベントは生きてるので普通に使えます

this.Application.GetType().GetEvents().First(x => x.Name == "ApplicationEvents4_Event_NewDocument").AddEventHandler(this.Application, hoge);

GetEventでも出せそうですがGetEvents.Firstのほうがあいまいでも出せるので…

しかし実際はReflectionしないでNewDocumentっていうのをもっと明確にすれば使えます
こんなコード

((Word.ApplicationEvents4_Event)this.Application).NewDocument += (d) => MessageBox.Show("NewDocument Test");

このオブジェクトブラウザに薄い文字で出てインテリセンスでも引っかからないインターフェースにキャストすることで行けます。
ApplicationClass自体はApplicationEvents4_Eventを実装してるらしいのでこれでなんとか

ちなみにApplicationEventsってくるインターフェースとかは1,2,3,4とありますが4が一番新しいので何もなければApplicationEvents4ってついてるのを使います
それでも2003ですが…


というわけでただのメモ書きです

Wordの機能とメソッドの対応がぜんぜんわかってなくてすごい難しい感じが
Excelだけ簡単すぎるって言うのは大体わかりますが

とりあえずこの辺で