みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでPowerPointを操作する方法についてシリーズでお伝えしています。
前回はコチラの記事。
エクセルVBAでPowerPointプレゼンテーションを開き、目的のスライド上のシェイプの名前をイミディエイトウィンドウに出力するプログラムを作りました。
PowerPointのテキストボックスなど特定のシェイプを操作する際には、シェイプのインデックス番号を指定して操作をする必要があります。
ということで、今回はエクセルVBAでシェイプのインデックス番号を調べる方法についてお伝えをします。
前回のおさらい:スライドの全てのシェイプ名を出力する
PowerPointスライドの特定のシェイプのインデックス番号を調べる方法については、前回のプログラムをベースとして使いますので、おさらいをしていきます。
Sub PowerPointシェイプのNameを出力する() Dim ppApp As New PowerPoint.Application ppApp.Visible = True Dim ppPrs As PowerPoint.Presentation Set ppPrs = ppApp.Presentations.Open(ThisWorkbook.Path & "\ひな形.pptx") Dim ppSld As PowerPoint.Slide 'スライドオブジェクト Set ppSld = ppPrs.Slides(1) '1ページ目のスライドをセット Dim shp As Object For Each shp In ppSld.Shapes Debug.Print shp.Name Next shp ppApp.Quit Set ppApp = Nothing End Sub
10行目まではPowerPointプレゼンテーションを開き、スライドオブジェクトをセットする処理です。
12行目~17行目で、スライド上のシェイプの集まりであるShapesオブジェクト内の全てのShapeについて、その名前をイミディエイトウィンドウに出力する箇所です。
Nameプロパティでシェイプの名前を取得する
なお前回の例で使ったスライドはこちらです。
その実行結果は
Slide Number Placeholder 2
TextBox 4
Oval 3
Right Arrow 5
Cloud Callout 6
でした。
Nameプロパティでは「種類 番号」という形で出力をされます。これがシェイプ名となるわけです。
しかし、ちょっと勘のいい皆さんだと「TextBox 4」と「Oval 3」の出力順が逆になっているのを不思議に思うかも知れませんね。
その秘密は後ほどわかります。
PowerPointスライドのシェイプのインデックス番号を調べる
シェイプ名の番号とインデックス番号は別物
Nameプロパティの「番号」がインデックス番号と考えるのが自然なのですが…残念ながら、全然、全く、とんでもなく違うんです。
シェイプ名の番号とインデックス番号は別物です。
では、どうするか?
イテレータを利用してインデックス番号を調べる
上記プログラムの12行目~17行目をちょっと修正してインデックス番号を調べていきたいと思います。
該当箇所を以下に差し替えます。
Dim i As Long i = 1 Dim shp As Object For Each shp In ppSld.Shapes Debug.Print "Shapes(" & i & ")", shp.Name i = i + 1 Next shp
たいしたことはしていませんね。For Eachのループごとにイテレータiを加算して、一緒に出力をしているだけです。
これを先ほどのスライドに対して実行をすると
Shapes(2) Slide Number Placeholder 2
Shapes(3) TextBox 4
Shapes(4) Oval 3
Shapes(5) Right Arrow 5
Shapes(6) Cloud Callout 6
となります。
このShapes(x)のxがインデックス番号というわけです。
例えばテキストボックスであれば、そのインデックス番号は3となります。
まとめ
エクセルVBAでPowerPointの特定のシェイプのインデックス番号を調べる方法についてお伝えしました。
ちょっと面倒ですよね…なぜNameプロパティの番号とインデックス番号が異なるのか…Microsoftさんに聞いてみたいところですが、とにかく惑わされないように注意頂ければと思います。
では次回はこのインデックス番号を使って、実際にシェイプの操作をしていきたいと思います。
どうぞお楽しみに!