VBAでPowerPointマクロを作成していて、アクティブなセクションの、先頭と最後のスライドのスライド番号(SlideIndex)を取得する必要がありました。
自分の備忘録の意味も込めて、アクティブセクションの先頭と最後のSlideIndexを取得するPowerPointマクロを公開しておきます。
アクティブなセクションの先頭と最後のスライドのSlideIndexを取得するサンプルマクロ
以下のマクロを実行すると、アクティブなセクションの先頭と最後のスライドのSlideIndexが、イミディエイトウィンドウに出力されます。
Dim sec_id As Long
sec_id = ActiveWindow.Selection.SlideRange.sectionIndex
With ActivePresentation.SectionProperties
Debug.Print "先頭のSlideIndex:" & _
.FirstSlide(sec_id)
Debug.Print "最後のSlideIndex:" & _
.FirstSlide(sec_id) + .SlidesCount(sec_id) - 1
End With
End Sub
エラー処理を入れていませんので、セクションという概念自体が存在しない2007以前のPowerPointで実行したときや、セクションのないプレゼンテーションをアクティブにしておいて実行すると実行時エラーが発生します。
サンプルマクロで行っている処理
アクティブなスライドのsectionIndexを取得して、
sec_id = ActiveWindow.Selection.SlideRange.sectionIndex
そのsectionIndexの、セクションの先頭スライドのSlideIndexと、
With ActivePresentation.SectionProperties
Debug.Print "先頭のSlideIndex:" & _
.FirstSlide(sec_id)
セクションの最後のスライドのSlideIndexに該当する数値をイミディエイトウィンドウに出力しています。
Debug.Print "最後のSlideIndex:" & _
.FirstSlide(sec_id) + .SlidesCount(sec_id) - 1
SectionPropertiesは異質なオブジェクト
「SectionProperties」という名前から全セクションを表すコレクションで、個々のセクションを表す単独のオブジェクトが存在しているように考えてしまう方がいるかもしれませんが、PowerPointのセクションを操作するオブジェクトは、そのような構造にはなっていません。
一般的なコレクションオブジェクトと単独のオブジェクトという構造になっていれば、全セクションを表すコレクションオブジェクトから、Itemメソッドで個別のセクションを表す単一オブジェクトを取得して、その先頭と最後のSlideIndexを取得する、という流れになります。
しかし、SectionPropertiesオブジェクトの場合、そのような構造とはなっていませんので、まったく違う形のコードになります。
SectionPropertiesオブジェクトのFirstSlideメソッドの引数に、セクションのインデックスを指定すると、指定されたセクションの最初のスライドのSlideIndexを取得できます。
最後のスライドのSlideIndexを返すLastSlide的なメソッドは用意されていませんが、SlidesCountメソッドを使うと指定されたセクションに含まれるスライドの枚数が取得できますから、
先のFirstSlideメソッドで返される数値と組み合わせて、
.FirstSlide(sec_id) + .SlidesCount(sec_id) - 1
アクティブセクションの最後のスライドのSlideIndexに該当する数値を作成しています。
最終更新日時:2020-04-25 10:20
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » セクション » PowerPoint VBAでアクティブセクションの先頭と最後のスライド番号を取得する