「マクロ 一番背後にあるpowerpointのシェイプを削除する」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
PowerPointのスライド上で複数の図形が重なっているときに、最背面にある図形をVBA(Visual Basic for Applications)を使って削除するには、どのようなコードを書けばいいのかを探している方による検索でしょうか。
選択されている図形から最背面のものを削除するサンプルマクロ
以下のようなマクロで、選択されている図形のうち、最背面の図形だけを削除できます。
Dim arr() As Long ' ShapeのZOrderPosition
Dim shp As Shape
Dim n As Long, i As Long
With ActiveWindow.Selection
If .Type <> ppSelectionShapes Then Exit Sub
With .ShapeRange
' ZOrderPositionを配列に格納
n = .Count
If n = 1 Then Exit Sub
ReDim arr(1 To n)
For i = 1 To n
arr(i) = .Item(i).ZOrderPosition
Next i
' ZOrderPositionが最小のShapeを削除
For i = 1 To n
If .Item(i).ZOrderPosition = min(arr) Then
.Item(i).Delete
Exit For
End If
Next i
End With
End With
End Sub
Function min(arr As Variant) As Double
' 配列データの最小値を返す
Dim i As Long
min = arr(LBound(arr))
For i = LBound(arr) To UBound(arr)
If arr(i) < min Then min = arr(i)
Next i
サンプルマクロの解説
Shapeが前面にいるのか背面にいるのかは、ZOrderPositionプロパティを調べるとわかります。ZOrderPositionが小さいほど背面に、大きいほど前面に存在しています。
つまり、選択されているShapeのZOrderPositonの一番小さいものが、最背面に存在していることになります。
上記マクロの、
With ActiveWindow.Selection
With .ShapeRange
n = .Count
ReDim arr(1 To n)
For i = 1 To n
arr(i) = .Item(i).ZOrderPosition
Next i
が、最背面の図形を調べるために、各ShapeのZOrderPositionの値を、配列へ格納している部分です。
配列にZOrderPositionの値を格納してから、もう一度For~Nextループを回して、
For i = 1 To n
最小値のZOrderPositionを持つShapeだったときに削除をしています。
If .Item(i).ZOrderPosition = min(arr) Then
.Item(i).Delete
ここでは、配列に格納されているデータの最小値を返すFunctionプロシージャを別に用意しました。
エラー回避のために、選択されているのが図形でなかった場合にマクロを終了しています。
With ActiveWindow.Selection
If .Type <> ppSelectionShapes Then Exit Sub
また、図形が一つだけされている場合には、削除を実行しないほうが良さそうに感じますので、選択されている図形の数が「1」だったときにもマクロを終了しています。
With .ShapeRange
n = .Count
If n = 1 Then Exit Sub
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 最背面の図形を削除するPowerPointマクロ