PowerPointのSlideRangeオブジェクトがFor Each~Next文で処理できることを、記事にしました。
これに関して、VBAについて深く理解しておられ、拙著『いちばんやさしいExcel VBAの教本』の執筆段階でのレビューでも大変お世話になったthomさんから、
「コレクションなら存在するはずの_NewEnumプロパティが、オブジェクトブラウザーで見えないのが不可解」
といった主旨のリプライをいただきました(非公開アカウントのため意訳させていただいています)。
折角の機会なので、この件について記事にさせていただきます。
_NewEnumプロパティとは
そもそも_NewEnumプロパティとは何でしょう。
VBA等から処理できるようなアプリケーションを作るときはこの方針で作ってくださいねと、Microsoftがまとめた公式文書『オートメーションプログラマーズリファレンス―ActiveXテクノロジを使用したアプリケーション開発技法 (MicrosoftPRESS)』の、p.28に以下の記述があります。
すべてのコレクションオブジェクトは、_NewEnumという読み取り専用のプロパティをエクスポーズして、ActiveXクライアントが反復処理をサポートするオブジェクトを認識できるようにしなければなりません。
逆に言えば、_NewEnumプロパティの存在するオブジェクトは、VBAのFor Each~Next文で処理できるということです。
この存在するはずの_NewEnumプロパティが、PowerPoint.SlideRangeでは見えないのが不可解だと、thomさんはおっしゃっているのです。
Excelライブラリーのコレクションでは_NewEnumを確認できる
先にExcelの状態を確認しましょう。
ExcelのVBEでオブジェクトブラウザーを表示して、非表示のメンバーを表示する設定で「_NewEnum」を検索すると、下図のように多くのコレクションに_NewEnumプロパティまたはメソッドが存在していることを確認できます。
Excel VBAでもっとも基本的なFor Each~Next処理できるWorkbooks・Sheets・Rangeいずれにも、_Enumプロパティが存在しています。
PowerPointライブラリーのコレクションでは_NewEnumを確認できないものが多い
これに対してPowerPointのオブジェクトブラウザーで、ライブラリーを「PowerPoint」に限定して検索した場合、下図のように_NewEnumが存在するオブジェクトはあまりないことがわかります。
今回thomさんが気になさったSlideRangeはもちろん、PowerPoint VBAでFor Each~Next処理できるもっとも基本的なPresentationsやSlidesでさえ、_NewEnumは見えません。
ただし内部的には_NewEnumに相当するプロパティまたはメソッドが存在しているからこそ、For Each~Next処理できているはずです。
そして、_NewEnumの見えていたコレクションをあらためて見直すと、Axes・DataLabels・SeriesCollectionといったグラフや、Shapes・ShapeNodesといった図形関連のコレクションだけであることがわかります。
ExcelからPowerPointにおそらく移植したのだろうと思われるオブジェクトにだけ、_NewEnumが見えているように感じます。
Officeライブラリーのコレクションでは_NewEnumを確認できる
一方、PowerPointライブラリーより、あとに登場したOfficeライブラリーに限定して「_NewEnum」を検索すると、下図のような状態になります。
たくさんのコレクションに_NewEnumが存在していることを確認できます。
Office 97の頃は内部仕様を統一しきれなかったのでは
VBAはOffice 97の頃に多くのOfficeアプリケーションで使えるようになりました。
その当時Microsoftは内部仕様を統一しきれなかったため、PowerPointのコレクションについては、VBEのオブジェクトブラウザーレベルでは_NewEnumが見えないものが多いのだろうと、私は推測しています。
最終更新日時:2019-01-11 06:12
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » _NewEnumプロパティがない?