スライドごとの、画像の位置とサイズをExcelに出力するPowerPointマクロをご紹介しました。
この記事の中で、指定したTypeのShapeの数を返すFunctionプロシージャもご紹介しています。
Excelに一覧を出力するマクロがメインテーマの記事でしたから、プレゼンテーションファイル全体から、指定したTypeのShapeの数を返すだけのFunctionプロシージャとしました。ですが、このFunctionプロシージャが使われるようなシーンを考えると、もう少し機能を持たせておいてもいいかもしれません。
スライドの範囲を指定すると、その範囲内で指定したTypeのShapeの数を返すFunctionプロシージャもニーズがありそうに思えます。
指定範囲内の指定されたTypeのShapeの数を返すFunctionプロシージャ
既にご紹介Functionプロシージャを、そんな形に修正してみました。
Function CountSpecifiedShapes( _
ByVal prs As Presentation, _
ByVal shpType As MsoShapeType, _
Optional ByVal firstSlideId As Long, _
Optional ByVal lastSlideId As Long) As Long
Dim shp As Shape
Dim n As Long, i As Long
Dim sldCnt As Long: sldCnt = prs.Slides.Count
If firstSlideId = 0 Then firstSlideId = 1
If lastSlideId = 0 Then lastSlideId = sldCnt
If _
firstSlideId < 0 Or _
firstSlideId > lastSlideId Or _
lastSlideId > sldCnt Then
Err.Raise Number:=5
Exit Function
End If
n = 0
For i = firstSlideId To lastSlideId
For Each shp In prs.Slides(i).Shapes
If shp.Type = shpType Then
n = n + 1
End If
Next shp
Next i
CountSpecifiedShapes = n
End Function上記のプロシージャは以下のような形で利用します。
Sub sample()
On Error GoTo ErrHndl
MsgBox CountSpecifiedShapes(Presentations(1), msoPicture, 3, 10)
Exit Sub
ErrHndl:
MsgBox Err.Description
End Sub
Functionプロシージャの解説
引数は4つ指定できます。
調べたいPresentationオブジェクトと、
ByVal prs As Presentation, _
Shapeの種別を指定するMsoShapeType列挙に定義された定数、
ByVal shpType As MsoShapeType, _
の2つは既にご紹介しているプロシージャと同じで、
調べたい先頭のスライド番号、
Optional ByVal firstSlideId As Long, _
調べたい最後のスライド番号、
Optional ByVal lastSlideId As Long) As Long
が新たに設けた引数です。Optionalキーワードを使うことで、これらfirstSlideId・lastSlideIdは省略可能になっています。
プロシージャの中では以下のような処理を行っています。
指定されたプレゼンテーションファイルのスライドの枚数を変数・sldCntに格納して、
Dim sldCnt As Long: sldCnt = prs.Slides.Count
引数・firstSlideIdが省略されていたときは「1」を、
If firstSlideId = 0 Then firstSlideId = 1
引数・lastSlideIdが省略されていたときはスライドの枚数を、
If lastSlideId = 0 Then lastSlideId = sldCnt
それぞれ代入しておきます。
firstSlideId・lastSlideIdに、不正な値が指定された場合は実行時エラーを上げるようにしています。
If _
firstSlideId < 0 Or _
firstSlideId > lastSlideId Or _
lastSlideId > sldCnt Then
Err.Raise Number:=5
Exit Function
End If
firstSlideIdがマイナスの値だったとき、firstSlideIdのほうがlastSlideIdより大きいとき、lastSlideIdがスライドの枚数より大きいときに、エラーとなるようにしています。エラー番号は「プロシージャの呼び出し、または引数が不正です。」というエラーメッセージの「5」を上げています。
メインの処理では、指定されたスライドに対するFor Nextループの中で、各スライド内の全Shapeに対してFor Each~Nextループを回して、
For i = firstSlideId To lastSlideId
For Each shp In prs.Slides(i).Shapes
Shapeの種別が、引数・shpTypeに指定されたものと同じだったときに、変数・nをインクリメントして、
If shp.Type = shpType Then
n = n + 1
End If
ループを抜けたら、変数・nの値を返しています。
Next shp
Next i
CountSpecifiedShapes = n
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 指定範囲内の指定されたTypeのShapeの数を返すPowerPointのFunctionプロシージャ