Powerpoint VBA Shapeのインデックスを調べる何度目か。
コレクションオブジェクトってとても面白い。
インデックスを簡単に知る方法を用意してくれてたらよかったのに,なぜかそこは無い。インデックスをプロパティで取れるようにぜひしてほしい。
でも,追加等簡単で,持った値が重複していても平気でいくつも保持してくれる,という特徴はありがたい限りなんです。
そうしないと,パワーポイントで図形をコピペするだけで,
「名前が重複しています。貼り付けることはできません」
的な怒られ方をして,コピペすらできない,という状況になるんでしょうね。
Excelのシートのように,数はたくさん作れるけどそうそう無尽蔵に無意味に増やすことはない,場合はいいんですが,わたしのように図をマクロで描いたり消したりしてインデックスが10000を余裕で超える使い方などでは,いちいち名前をどうするのかというのはうざいかぎりです。
なので,今の名前は重複OKな仕様については,この方が便利で柔軟だからうまく使ってね,というスタンスは仕方のないものだと思っています。
でもまぁ,図形を捕捉する必要がある場合はあるわけで,特に複数の図形を選ぶ,狙った図形だけをグループ化する,という場合,名前が役に立たないならインデックスがどうしても必要。。
なので,何度でもこの問題を私は考えてしまうのだと思います。なんとなくぽーっと考えると,この話を考えている。。
今までも何度か記事にもしてきました。
Powerpoint VBAでわからないこと - Powerpoint VBAを使おう!
パワーポイントの図形のインデックスについて② - Powerpoint VBAを使おう!
似たようなものですが,今回は次のように考えてみました。
Sub test() Dim TShp As Shape Set TShp = ActiveWindow.Selection.ShapeRange(1) Dim s As Shape Dim i As Long: i = 1 For Each s In ActiveWindow.View.Slide.Shapes If s Is TShp Then Exit For i = i + 1 Next MsgBox (i) End Sub
今までのよりどんどん大雑把になっていってます。いいことだと思っています。
選んだ図形のインデックスを調べるコードです。
For Each の響きが私的には片っ端から全部,という ランダムっぽいイメージがもともとありました。
でも,コレクションの仕様などを学習するうちに,ちゃんとインデックスが振られていてきちんとその順番に処理をするものなんだ,と今はとらえています。
また,図形をFor Eachで消そうとした時にイテレータの都合で半分くらい残るという現象から,
パワーポイントの図形のインデックスは動的に変化していることがわかるわけです。固定ではない。
さらに,1番の図形をずっと消すという書き方をして,全部消せることから,ちゃんと詰まっていってることもわかります。
ならばということで今回のコードです。Option Explicit 書かずに宣言せずに書いたらかなり短いコードだと思います。
For Eachでちゃんと順番を追ってカウントしていってくれるんだから,iで足していって,同じ図形を指しているかを is で比較して,一緒だったら抜けちゃえというコード。
一応軽く確認した感じでは,Msgboxで出てきた数値と,その数値で図形を指定して色を塗ってみるという操作をすると,きちんと一致しているようです。
こういう遊び(?)でだいぶコレクションオブジェクトと仲良くなれたんだなぁと思います。
そうすると,WordやExcel,Powerpointを構成する部品たちにはコレクションオブジェクトが極めたたくさんあることがわかる。
その挙動を理解できてきたことはコーディングの上でシンプルに組める助けになってくれる気がしています。