t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 似ているようで違うExcel・Word・PowerPointのシェイプをオブジェクトブラウザーで比較する

ブック、シート、セルなどの操作に比べると、シェイプの操作に関する情報はまだまだ少なく、ある程度コツをつかむまではマクロ記録で調べながらの対応となる。

Excelのマクロの記録は優秀で、シェイプに行った操作も逐一記録してくれる。

しかしWordのマクロの記録は申し訳程度のものでシェイプの操作は記録してくれない。PowerPointに至ってはそもそもマクロの記録機能自体なくなってしまった。

そこでExcelで記録したシェイプの操作をPowerPointやWordに移植しようと考える。

Excel、Word、PowerPointにはそれぞれオートシェイプ機能が備わっており、大体同じように使用できる。
また、これらのシェイプを相互にコピー&ペーストすることも可能だ。

f:id:t-hom:20160104234016p:plain

ならばVBAのコードもそのまま移植できるはず!

…と思ったら大間違いで、実はExcel・Word・PowerPointのシェイプはそれぞれ別物だ。概ね同じようなメソッド・プロパティを備えているため、シェイプ操作の大部分は流用できるのだが、あるプロパティがExcelのシェイプにはあって、PowerPointには無いなんてこともあるのでそのまま実行すると何かしらエラーになることが多い。

VBAExcel以外のシェイプを操作しようとすると、この違いでハマりやすいので、今回はアプリケーションごとのシェイプが持つ機能をオブジェクトブラウザーで調べる方法について書こうと思う。

まずExcelのVBEからWordとPowerPointを参照設定しておく。
f:id:t-hom:20160105001109p:plain

次に表示メニューか、F2キーでオブジェクトブラウザーを起動する。

オブジェクトブラウザーの余白で右クリックし、完全に一致する単語だけを検索にチェックを入れておく。
f:id:t-hom:20160105001500p:plain

そして、コンボボックスから「すべてのライブラリ」を選んだ状態で、Shapeと入力し、Enterで検索する。
すると、ExcelPowerPoint、WordにそれぞれShapeクラスが表示される。
f:id:t-hom:20160105001656p:plain

アプリごとの固有のプロパティを一つ選んで赤線を引いてみた。
f:id:t-hom:20160105002234p:plain

特にハマリやすいのは、ShapeのTextFrameプロパティである。ExcelPowerPointのシェイプにはTextFrameの他に、TextFrame2というプロパティが備わっており、TextFrame2の方が設定できるプロパティが多い。しかしWordにはTextFrame2は用意されておらず、設定項目は全てTextFrameにまとまっている。

また、オブジェクトブラウザーからプロパティを選択すると、下のペインに簡単な情報が表示される。
図の例では、TextFrameプロパティは、TextFrame型のオブジェクトを返すことが分かる。
f:id:t-hom:20160105003403p:plain

この緑色で書かれたTextFrameをクリックすると、TextFrameのメンバー一覧へジャンプできる。

なお、今回はアプリごとの比較だったのですべてのライブラリを選択したが、項目が多くなりすぎるので個別に調べたいときはライブラリを選択すると良い。WorkbookやWorksheet、RangeなどのExcelオブジェクトについてはExcelライブラリを、CollectionやVBA関数などはVBAライブラリを選択すると表示される。

たとえば定数「vbNewLine」を検索してみると、Constantsモジュールの中にあることが分かり、他にどんな定数があるのかも分かる。
f:id:t-hom:20160105004830p:plain

なお、検索結果にクラスとなっているが、実際には標準モジュールである。
f:id:t-hom:20160105005049p:plain

クラスモジュールか標準モジュールかは、アイコンでも判断できる。
プロジェクトエクスプローラーで使用されているのと同じアイコンだ。
f:id:t-hom:20160105005155p:plain

オブジェクトブラウザーを使いこなすとかなりマクロ作成が捗るので、まだ使いこなせていない方は以下のサイトで使い方を押さえておくと良いと思う。
nasunoblog.blogspot.jp

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。