エクセルVBAでPowerPointの特定のシェイプのインデックス番号を調べる方法


index-box

photo credit: Week 27 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでPowerPointを操作する方法についてシリーズでお伝えしています。

前回はコチラの記事。

エクセルVBAでPowerPointスライド上のシェイプ一覧を取得する
エクセルVBAでPowerPointを操作する方法についてシリーズでお伝えしています。今回はPowerPointスライドのシェイプ一覧を取得する方法とShapeとShapesオブジェクトについてです。

エクセル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プロパティでシェイプの名前を取得する

なお前回の例で使ったスライドはこちらです。

PowerPointスライドの例

その実行結果は

Footer Placeholder 1
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(1) Footer Placeholder 1
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さんに聞いてみたいところですが、とにかく惑わされないように注意頂ければと思います。

では次回はこのインデックス番号を使って、実際にシェイプに文字入力の操作をしていきたいと思います。

エクセルVBAでPowerPointのテキストボックスに文字を入力する
エクセルVBAでPowerPointを操作する方法についてシリーズでお伝えしています。今回はシェイプ操作の初級編、エクセルVBAからPowerPointスライドのテキストボックスの文字を入力する方法です。

どうぞお楽しみに!

連載目次:エクセルVBAでグラフとPowerPointを操作する

エクセルで様々な集計や分析をした結果の表やグラフを、最終的にPowerPointに貼り付け…という作業は結構多いですよね。1つ2つなら良いですが、大量にあった場合は大変です。そんな時にはVBAで自動化をしてしまいましょう!
  1. エクセルVBAでPowerPointを操作するための準備と最も簡単なプログラム
  2. エクセルVBAでPowerPointのプレゼンテーションを開く方法・スライドを取得する方法
  3. エクセルVBAでPowerPointスライド上のシェイプ一覧を取得する
  4. エクセルVBAでPowerPointの特定のシェイプのインデックス番号を調べる方法
  5. エクセルVBAでPowerPointのテキストボックスに文字を入力する
  6. エクセルVBAでPowerPointでタイトルを変更しながらスライドを大量に生成する
  7. 初心者でも分かる!エクセルVBAでグラフを操作し取り扱うための超基本の第一歩
  8. エクセルVBAでグラフの元となるデータ範囲を次々と変更するプログラム
  9. 簡単!エクセルVBAでシート上のグラフをコピーしてPowerPointにペーストする
  10. エクセルVBAでグラフのデータ範囲を変更しながらPowerPointに連続して貼り付ける
  11. エクセルVBAでグラフタイトルを変更する方法とChartTitleについて
  12. エクセルVBAでグラフの軸の最大値・最小値や軸タイトルを設定する方法

コメント

  1. じゅんこ より:

    はじめまして。いろいろ探してここを最初からやってEXCELの値をテキストボックスに代入しようとしています。この項目と次の項目でprintのところで出ないか、一瞬出て消えてしまい、shapeの番号がわかりません。office professional plus 2016 ver.1803です。

タイトルとURLをコピーしました