スポンサーリンク

【PowerPoint VBA入門】PowerPoint VBAの構造と図形取得についてわかりやすく説明します!

VBAでの操作

こんにちは、blueです。

今回はPowerPoint VBAについて説明します。

PowerPoint VBAのオブジェクト構造はExcelと似ています。

ただし、PowerPointでは図形がメインの為、図形取得以降の処理が大変になります。

今回からの記事を読めば

  • PowerPointの階層構造が理解できる
  • PowerPoint内の図形を取得できる
  • 図形内のテキストを取得できる

ようになりますので参考にしていただければ幸いです。

なお、この記事はExcel VBAをある程度理解されている方をメインとしています。最初からPowerPointでVBAを書こうと思われている方は以下が参考になると思います。

ちなみに今回の記事は以下の書籍を参考にしています。

各種オブジェクトに対する説明がとても丁寧で、この書籍を1冊読めばPowerPointでVBAの操作ができるようになると思います。ぜひご参考ください。

本題に入る前に今回の記事はPowerPointでVBAを処理する内容となります。Excel VBAで処理したい場合は最後の補足1をお読みください。

スポンサーリンク

Power Pointの階層構造(基本)

PowerPointの基本の階層構造は以下になります。

なお図形(Shape)以降はややこしいので次回以降で説明します。

クリックすると拡大します

Shapeまでの構造は基本的にExcelと変わらないので

  • Presentation=Workbook
  • Slide=Worksheet
  • Shape=Range

というざっくりとした考えでいいと思います。

なお絵であらわすと以下のようになります。

クリックすると拡大します
クリックすると拡大します

ここまではExcelとあまり変わらないことがわかると思います

Shapeまでのオブジェクトの取得方法

では次にShapeまでの取得について説明します。

  • Presentation
  • Slide
  • Shape

のそれぞれについて以降で説明します

Presentationオブジェクトの取得

Presentationオブジェクトの取得にはアクティブなプレゼンテーションを表すActivePresentationプロパティを使います。

以下ではアクティブなプレゼンテーションを取得してDebug.Printでイミディエイトウィンドウにファイル名とパスを表示させています

Sub Presentation取得()

    Dim prs As Presentation
    
    Set prs = ActivePresentation

    Debug.Print prs.Name
    Debug.Print prs.Path
    
End Sub

以下のようにイミディエイトウィンドウに表示されることがわかります。

クリックすると拡大します

なお、PowerPoint VBAにはExcel VBAで現在使用しているマクロブックにあたるThisWorkbookのようなものは存在しません。

Activeで取得するのに違和感を感じる方もおられるかと思いますが仕様なのでご了承ください。

Slideオブジェクトの取得

次に各スライドを取得します。Power Pointのイメージは以下になります。

クリックすると拡大します

Slideオブジェクトの取得にはSlidesコレクションを使用します。

これはWorksheetsコレクションと一緒のような使い方です。

なお特定のSlideのみを取得する場合は、Slides.Item(1)かSlides(1)のように表記することができます。

以下ではFor Each ~Next文を使用して各Slideオブジェクトを取得したのち、各スライドを選択したうえでDebug.Printでイミディエイトウィンドウにスライド名を表示させています。

Sub Slide取得()

    Dim sld As Slide
    Dim prs As Presentation
    
    Set prs = ActivePresentation

    For Each sld In prs.Slides
    sld.Select
        Debug.Print sld.Name
    Next
    
End Sub

ステップインで確認すると1枚ずつスライドが選択されていることがわかると思います。

またイミディエイトウィンドウにも以下のように表示されます。

Shapeオブジェクトの取得

次にスライド内の各図形を取得します。Power Pointのイメージは以下になります。

Shapeオブジェクトの取得にはShapeコレクションを使用します。

以下ではFor Each ~Next文を使用して各スライドにある各Shapeオブジェクトを取得したのち、図形を選択したうえでDebug.Printでイミディエイトウィンドウに図形名と図形のタイプを表示させています。

Sub Shape取得()

    Dim sld As Slide
    Dim prs As Presentation
    Dim shp As Shape
    
    Set prs = ActivePresentation

    For Each sld In prs.Slides
        For Each shp In sld.Shapes
            shp.Select
            Debug.Print shp.Name
            Debug.Print shp.Type
        Next
    Next
    
End Sub

なお追加部分は以下になります。

For Each shp In sld.Shapes
  shp.Select
  Debug.Print shp.Name
  Debug.Print shp.Type
Next

各スライド内の各図形~という形でFor Each~Next文が入れ子になっていることに注意ください。

またイミディエイトウィンドウにも以下のように表示されます。

クリックすると拡大します

最初の名前は「図形名称」になります。数字は作成順です。

また下の数字はShapeの大まかな種類を表しています。ちなみに17はテキストボックス、19はリボンから挿入した表を表します。

詳しくは以下をご確認ください。msoShapeType定数に番号と内容が示されています。

今回のまとめ

今回の記事で

  • PowerPointの階層構造を理解する
  • PowerPoint内の図形を取得する

ところまでを勉強しました。

実際のところShapeまでの取得はそこまで難しくはありません。

ただShapeより深い階層の情報を取る際は考慮が必要になりますので次回以降で説明します。

補足1 Excel VBAからPowerPointを操作する場合

Excel VBAからPowerPointを操作する際にはExcel VBAからPowerPointのライブラリを使用できるようにする準備が必要です。その方法は2種類あります。

参照設定ありの場合

Visual Basic Editorのメニューから「ツール」→「参照設定」と開いて「Microsoft PowerPoint X.X Object Library」のチェックをいれてください。

クリックすると拡大します

そのうえで以下のコードで変数の定義とインスタンス化(実体化)を行います。

なお最後のVisibleはアプリケーションの表示をさせるコードになります。

Dim ppt As PowerPoint.Application
Set ppt = New PowerPoint.Application
ppt.Visible=True

参照設定なしの場合

以下のコードで変数の定義とインスタンス化(実体化)を行います。

Dim ppt As Object
Set ppt = CreateObject("PowerPoint.Application")
ppt.Visible=True

この方法だと事前の参照設定は不要ですがインテリセンス(自動補完機能)が効かないなどデメリットが多いので参照設定ありをお勧めします。

これらの処理を施すことでExcel VBAからもPower Pointを操作することができます。ただし共通のオブジェクト(Shapeなど)が存在する為、型の宣言には注意ください
(Dim shp As PowerPoint.ShapeなどのようにPowerPointのshape型と記載しないといけません)

補足2 各種変数名について

この記事では各種オブジェクトの変数名を以下のようにしています。

最初は変数名を書くのにも悩む為備忘録として置いておきます。

書籍をもとにしていますがご参考ください。

Dim ppt As PowerPoint.Application  'Applicationオブジェクト
Dim prs As Presentation 'Presentationオブジェクト
Dim sld As Slide 'Slideオブジェクト
Dim shp As Shape 'Shapeオブジェクト
Dim clm As Column  '(テーブルの) Columnオブジェクト
Dim cl As Cell '(テーブルの)Cellオブジェクト
Dim nd As SmartArtNode  'SmartArtのNodeオブジェクト

コメント

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