2011年02月11日

ThisDocument

ExcelのVBAでは、ApplicationオブジェクトにThisWorkbookプロパティというのがあり、そのコードを含むブックを表すWorkbookオブジェクトを返します。

WordのVBAでもたぶん同じようなものだろうと思い、よく調べもせずThisDocumentというキーワードを使ってコードを書いてみたところ、やはり同じようにコードを含むDocumentオブジェクトが取得できました。
それで、これもやはりApplicationオブジェクトのプロパティなのだろうと思い込んでいたのですが、最近いただいた問い合わせをきっかけに調べ直してみたところ、WordのApplication(Global)オブジェクトにはそんなプロパティはない(もちろんメソッドもない)、ということがわかりました。

それならこのThisDocumentは何なのか、なぜコードを含むDocumentオブジェクトが取得できるのかというと、これは要するにクラス名(オブジェクト名、コードネーム)をそのまま指定している、ということなんですね。
Excel VBAで、Sheet1を表すWorksheetオブジェクトを取得するのに、「Sheets("Sheet1")」ではなく直接「Sheet1」と指定することもできるように、Wordの文書を表すDocumentオブジェクトのクラス名の初期値が「ThisDocument」であり、それを名前で直接指定していたわけです。

クラス名は変更可能なので、この「ThisDocument」という名前を変えた場合は、その変えた名前で指定する必要があります。
「コードを含むDocumentオブジェクトを表すプロパティ」だと思い込んで、クラス名を変更した状態でうっかり「ThisDocument」を使用してしまうと、参照設定されているNormalテンプレートのDocumentオブジェクトが返され、状況によっては結構大きな問題が発生することになります。

それではExcelのThisWorkbookに相当するプロパティはWordにはないのか、と調べてみたところ……どうやらMacroContainerというプロパティがそれに当たるようですね。

Word VBAを普段から業務で使っている人には「何を今頃」というような話かもしれませんが(「それで本なんか書くなよ」という声が聞こえそう)、このネーミングもなかなかわかりにくく、特にExcel VBAでThisWorkbookを使った経験のある人ほど、たどりつくのが一苦労という気がします。

逆に言うと、クラス名とプロパティ名が同じ「ThisWorkbook」というのも、それはそれで紛らわしい気がしてきました。
posted by 土屋和人 at 13:19| Comment(0) | TrackBack(0) | Word
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/43361783
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック