画像の位置とサイズを、配列を使わずに随時Excelに出力するPowerPointマクロをご紹介しました。
今回は2次元配列を使って同じことを行うマクロをご紹介します。
配列を利用する場合の課題
配列を利用する場合、マクロのどこかで配列の要素数を決めなければなりません。
今回の場合、画像の情報を配列に格納するわけですから、要素数は画像の数です。
PowerPointのプレゼンテーションファイルの中に、画像がいくつあるのかを返すプロパティなどが存在していれば、そのプロパティを使えば済みますが、残念ながらそういったプロパティは存在していないようです。
そのため、全Slideに対してループを回して各Slide内の全Shapeに対してループを回して、各Shapeが画像かどうかを調べてカウントする、という方法で画像の数を調べて配列の要素数を決める必要があります。
指定された種別のShapeの数を返すFunctionプロシージャ
画像の数だけを調べるだけのFunctionプロシージャを作ってもいいのかもしれませんが、画像に限らず他の種類でも数を取得したいというニーズはありそうですから、指定された種類のShapeの数を返すFunctionプロシージャを、作ってみました。
Function CountSpecifiedShapes( _
ByVal prs As Presentation, _
ByVal shpType As MsoShapeType) As Long
Dim sld As Slide
Dim shp As Shape
Dim n As Long
n = 0
For Each sld In prs.Slides
For Each shp In sld.Shapes
If shp.Type = shpType Then
n = n + 1
End If
Next shp
Next sld
CountSpecifiedShapes = n
End Function引数を2つ指定するFunctionプロシージャです。
Shapeの数を調べたいPresentationオブジェクトと、
ByVal prs As Presentation, _
Shapeの種類を指定するためのMsoShapeType列挙に定義されている定数を、
ByVal shpType As MsoShapeType) As Long
引数に指定するFunctionプロシージャにしました。
ちなみにMsoShapeType列挙には以下のような定数が定義されています。
指定されたPresentationオブジェクトの全SlideにFor Each~Nextループを回して、
For Each sld In prs.Slides
各Slide内の全ShapeにFor Each~Nextループを回し、
For Each shp In sld.Shapes
ShapeのTypeプロパティが、このFunctionプロシージャの引数に指定されたShapeのTypeと同じだったら、
If shp.Type = shpType Then
変数・nをインクリメントしています。
n = n + 1
ループ処理が終わったら、指定されたShapeの数を返しています。
Next shp
Next sld
CountSpecifiedShapes = n
(このFunctionプロシージャの機能追加版をご紹介しました。2015-09-10)
配列を使って画像の位置とサイズをExcelに出力するサンプルマクロ
で、この記事の本題である、配列を使った画像の位置とサイズをExcelに出力するPowerPointマクロです。
Const P2CM = 1 / 72 * 2.54 'Points To CentiMeters
Dim sld As Slide, shp As Shape
Dim arr() 'スライド番号, 上端から, 左端から, 高さ, 幅
Dim n As Long '画像の数
n = CountSpecifiedShapes(ActivePresentation, msoPicture)
If n = 0 Then
MsgBox "画像が存在しないため処理を終了します。"
Exit Sub
End If
ReDim arr(1 To n, 1 To 5)
n = 0
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.Type = msoPicture Then
n = n + 1
arr(n, 1) = sld.SlideIndex
arr(n, 2) = shp.Top * P2CM
arr(n, 3) = shp.Left * P2CM
arr(n, 4) = shp.Height * P2CM
arr(n, 5) = shp.Width * P2CM
End If
Next shp
Next sld
With CreateObject("Excel.Application")
.Workbooks.Add
.Range("A1").Value = ActivePresentation.Name
.Range("A2").Value = "スライド番号"
.Range("B2").Value = "上端から"
.Range("C2").Value = "左端から"
.Range("D2").Value = "高さ"
.Range("E2").Value = "幅"
.Range(.Cells(3, "A"), .Cells(n + 2, "E")).Value _
= arr()
.Range("A1:E2").Font.Bold = True
.Range("A1").CurrentRegion.EntireColumn.AutoFit
.Visible = True
End With
サンプルマクロの解説
先のFunctionプロシージャを利用して画像の数を取得して、
n = CountSpecifiedShapes(ActivePresentation, msoPicture)
画像の数が「0」だったときにはマクロを終了し、
If n = 0 Then
MsgBox "画像が存在しないため処理を終了します。"
Exit Sub
End If
「0」ではなかったときに、配列のサイズを確定しています。
ReDim arr(1 To n, 1 To 5)
第1次元の要素数はFunctionプロシージャで取得した画像の数です。
第2次元の要素数は、スライド番号・上端からの距離・左端からの距離・高さ・幅を格納するので「5」です。
最終的にExcelに書き出すので配列の添字のスタートは「0」ではなく「1」にしています。
全Slideに対するループの中で、各Slide上の全Shapeに対するループを回して、
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
画像だったときに、スライド番号・上端からの距離・左端からの距離・高さ・幅を、配列・arrに格納しています。
If shp.Type = msoPicture Then
n = n + 1
arr(n, 1) = sld.SlideIndex
arr(n, 2) = shp.Top * P2CM
arr(n, 3) = shp.Left * P2CM
arr(n, 4) = shp.Height * P2CM
arr(n, 5) = shp.Width * P2CM
End If
ShapeオブジェクトのTop・Left・Height・Widthプロパティが返す値の単位はポイントなので、センチメートルに換算する処理を、定数・P2CMを使って行っています。
配列にデータを格納したら、Excelを起動して、
With CreateObject("Excel.Application")
ワークブックを追加し、
.Workbooks.Add
A1セルにプレゼンテーションファイルの名前を入力後に、
.Range("A1").Value = ActivePresentation.Name
A2:E2セルに見出しを作成して、
.Range("A2").Value = "スライド番号"
.Range("B2").Value = "上端から"
.Range("C2").Value = "左端から"
.Range("D2").Value = "高さ"
.Range("E2").Value = "幅"
一気に配列のデータを書き出しています。
.Range(.Cells(3, "A"), .Cells(n + 2, "E")).Value _
= arr()
2次元配列・arrと同じサイズのRangeオブジェクトのValueオブジェクトに、配列から一気に値を代入するこの部分がこのマクロのポイントです。
その後、体裁を整えてから、
.Range("A1:E2").Font.Bold = True
.Range("A1").CurrentRegion.EntireColumn.AutoFit
Excelを表示しています。
.Visible = True
今回のマクロは、Functionプロシージャを使っていますが、全Slideに対するループと各Slide内の全Shapeに対するループが、結局2回行われています。ここを気持ち悪いと感じる方もいらっしゃるかもしれません。次回は、そんな方向けのマクロをご紹介します。(Functionプロシージャを利用しないマクロをご紹介しました。2015-09-08)
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » 画像 » 配列を使って画像の位置とサイズをExcelに出力するパワポマクロ