Home » パワーポイントマクロ・PowerPoint VBAの使い方 » 画像 » 配列を使って画像の位置とサイズをExcelに出力するパワポマクロ

配列を使って画像の位置とサイズをExcelに出力するパワポマクロ

対象:PowerPoint2007, PowerPoint2010, PowerPoint2013

画像の位置とサイズを、配列を使わずに随時Excelに出力するPowerPointマクロをご紹介しました。

今回は2次元配列を使って同じことを行うマクロをご紹介します。

配列を利用する場合の課題

配列を利用する場合、マクロのどこかで配列の要素数を決めなければなりません。

今回の場合、画像の情報を配列に格納するわけですから、要素数は画像の数です。

PowerPointのプレゼンテーションファイルの中に、画像がいくつあるのかを返すプロパティなどが存在していれば、そのプロパティを使えば済みますが、残念ながらそういったプロパティは存在していないようです。

そのため、全Slideに対してループを回して各Slide内の全Shapeに対してループを回して、各Shapeが画像かどうかを調べてカウントする、という方法で画像の数を調べて配列の要素数を決める必要があります。

[スポンサードリンク]

指定された種別のShapeの数を返すFunctionプロシージャ

画像の数だけを調べるだけのFunctionプロシージャを作ってもいいのかもしれませんが、画像に限らず他の種類でも数を取得したいというニーズはありそうですから、指定された種類のShapeの数を返すFunctionプロシージャを、作ってみました。

''指定されたTypeのShapeの数を返す
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列挙には以下のような定数が定義されています。

配列を使って画像の位置とサイズをExcelに出力するPowerPointマクロ

指定された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マクロです。

Sub 全画像の位置とサイズをExcelに出力_配列利用()

 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

End Sub

サンプルマクロの解説

先の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に出力するパワポマクロ

Copyright © インストラクターのネタ帳 All Rights Reserved.

.