「パワーポイント vba 画像のサイズ取得」
という検索でこのサイト・インストラクターのネタ帳へのアクセスがありました。
プレゼンテーションファイル内に存在している画像のサイズ・大きさを取得する、VBA(Visual Basic for Applications)のコードを探している方による検索です。
「画像のサイズ取得」ということですが、実務での利用シーンを考えると、サイズ・大きさだけではなく、スライド内での画像の位置も必要なのではないかという気がします。
たくさんのスライドに画像が存在しているときに、位置やサイズがスライドごとにバラバラになってしまっているので、それらを揃えるために、まずは現時点での画像の位置とサイズを調べたい、というのが実務で上がりそうな要望に思えるからです。
画像の位置とサイズを取得するサンプルマクロ
まず、PowerPoint VBAで画像の位置とサイズを取得する基本を確認しましょう。
Const P2CM = 1 / 72 * 2.54 'Points To CentiMeters
Dim shp As Shape
For Each shp In _
ActiveWindow.Selection.SlideRange.Shapes
If shp.Type = msoPicture Then
With shp
MsgBox _
"上端から" & vbTab & .Top * P2CM & vbCrLf & _
"左端から" & vbTab & .Left * P2CM & vbCrLf & _
"高さ " & vbTab & .Height * P2CM & vbCrLf & _
"幅 " & vbTab & .Width * P2CM
End With
End If
Next
以上のようなマクロで、アクティブスライド上に存在する画像の位置とサイズを取得できます。
アクティブなスライドのすべてのShapeに対してFor Each~Nextループを回して、
For Each shp In _
ActiveWindow.Selection.SlideRange.Shapes
もしShapeが画像だったときに、
If shp.Type = msoPicture Then
上端・左端からの距離と、高さ・幅をメッセージボックスに表示しています。
MsgBox _
"上端から" & vbTab & .Top * P2CM & vbCrLf & _
"左端から" & vbTab & .Left * P2CM & vbCrLf & _
"高さ " & vbTab & .Height * P2CM & vbCrLf & _
"幅 " & vbTab & .Width * P2CM
Shapeオブジェクトの、
Topプロパティで、スライドの上端からの距離
Leftプロパティで、スライドの左端からの距離
Heightプロパティで、高さ
Widthプロパティで、幅
を、それぞれ取得できます。
これらのプロパティで返される値の単位はポイントなので、定数・P2CMに「1 / 72 * 2.54」という、ポイントをセンチメートルに換算するための値を定義しておいて、掛け算することで単位をcmにしています。
画像の位置とサイズをExcelに出力するPowerPointマクロ
たくさんの画像が含まれているプレゼンテーションファイルで、位置とサイズを取得したいという場合、Excelに出力するのが便利でしょう。
以下のようなマクロで、アクティブなプレゼンテーションファイルの、すべての画像の位置とサイズを、新規のExcelファイルに出力できます。
Const P2CM = 1 / 72 * 2.54 'Points To CentiMeters
Dim xls As Object 'Excel.Application
Dim sld As Slide
Dim shp As Shape
Dim r As Long 'Excelの行番号
Set xls = CreateObject("Excel.Application")
With xls
.Workbooks.Add
.Range("A1").Value = ActivePresentation.Name
.Range("A2").Value = "スライド番号"
.Range("B2").Value = "上端から"
.Range("C2").Value = "左端から"
.Range("D2").Value = "高さ"
.Range("E2").Value = "幅"
.Range("A1:E2").Font.Bold = True
End With
r = 3
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.Type = msoPicture Then
With xls
.Cells(r, "A") = sld.SlideIndex
.Cells(r, "B") = shp.Top * P2CM
.Cells(r, "C") = shp.Left * P2CM
.Cells(r, "D") = shp.Height * P2CM
.Cells(r, "E") = shp.Width * P2CM
End With
r = r + 1
End If
Next shp
Next sld
With xls
.Range("A1").CurrentRegion.EntireColumn.AutoFit
.Visible = True
End With
Set xls = Nothing
プログラミングに慣れている方の場合、すべての画像の位置とサイズを2次元配列に格納しておいてから一気にExcelに書き出す、という方法を思いつくはずですが、今回のケースは配列を使って実装しようとすると考えるべきことが少々増えます。
配列を使うマクロは後日ご紹介しますが、特に配列に慣れていない方は、まず上記の、随時Excelに書き出すマクロを理解することをおすすめします。(配列を使ったマクロをご紹介しました。2015-09-07)
コードの中身は以下のとおりです。
Excelを画面に見えない状態で起動して、
Set xls = CreateObject("Excel.Application")
新規ブックを作成して、
With xls
.Workbooks.Add
アクティブなPowerPointのファイル名をA1セルに入力し、
.Range("A1").Value = ActivePresentation.Name
A2:E2セルに見出しを作成します。
.Range("A2").Value = "スライド番号"
.Range("B2").Value = "上端から"
.Range("C2").Value = "左端から"
.Range("D2").Value = "高さ"
.Range("E2").Value = "幅"
.Range("A1:E2").Font.Bold = True
見出しを作成したら、アクティブなプレゼンテーションの全Slideに対するFor Each~Nextループを回して、
For Each sld In ActivePresentation.Slides
各スライドの全Shapeに対してFor Nextループを回して、
For Each shp In sld.Shapes
Shapeが画像だったときに、
If shp.Type = msoPicture Then
スライド番号・上端からの距離・左端からの距離・高さ・幅を書き出して、
With xls
.Cells(r, "A") = sld.SlideIndex
.Cells(r, "B") = shp.Top * P2CM
.Cells(r, "C") = shp.Left * P2CM
.Cells(r, "D") = shp.Height * P2CM
.Cells(r, "E") = shp.Width * P2CM
End With
行番号を表す変数・rをインクリメントしています。
r = r + 1
全Slideの全Shapeに対するループが終わったら、
Next shp
Next sld
Excelに書き出した一覧の列幅を調整して、
With xls
.Range("A1").CurrentRegion.EntireColumn.AutoFit
Excelを表示して終了です。
.Visible = True
End With
Set xls = Nothing
次回、2次元配列を使って、同じことを行うマクロをご紹介します。(配列を使ったマクロをご紹介しました。2015-09-07)
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » 画像 » 画像の位置とサイズをExcelに出力するPowerPointマクロ