【VBA】パワポの図形を重なっている順に整列させるには【PowerPoint】
- [記事公開]2023.03.23
- VBA
- PowerPoint, PPT, VBA
Yahoo!知恵袋の質問に答えた中から紹介します。PowerPointVBAです。図形を整列させたいのですが、条件があって、重なっている順に左から並べたいというものです。
質問
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13277117603
パワポのマクロを教えてください。
選択した重なっている画像を、
重ならないように横に並べるマクロを作りたいのですが、
どのように組めばいいでしょうか。希望としては、
マクロ実行前に下から並んでいる順に、
マクロ実行後には左から並んであるということをやりたいです。添付例でいうと、
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13277117603
□×〇が正解で、○×□とはしたくないということです。
回答
私が考えたコードがこちら↓です。標準モジュールに記述します。
Option Explicit
Sub 重ならないように横に並べる()
With ActiveWindow.Selection
If .Type <> ppSelectionShapes Then Exit Sub '選択されたものがShapesでなければ処理終了
Dim lMax As Long
lMax = .ShapeRange.Count
'ZOrderPositionに応じて、ShapesのTopとLeftの情報を編集する
Dim ii As Long
For ii = 1 To lMax - 1
Call AlignTwoShapes(.ShapeRange, ii) '2つのShapesを整列させる処理
Next ii
'ここまでで整列しているはずだが、念のため上下左右に整列させる
With .ShapeRange
.Distribute msoDistributeVertically, msoFalse
.Distribute msoDistributeHorizontally, msoFalse
End With
End With
End Sub
Private Sub AlignTwoShapes(ByRef Poss As Object, ByVal lZorder As Long)
Dim BaseTop As Long
Dim BaseLeft As Long
Dim SecondLeft As Long
Dim lMax As Long
Dim ii As Long
lMax = Poss.Count
'lZorderと同じZOrderShapeの情報を把握する
For ii = 1 To lMax
If Poss(ii).ZOrderPosition = lZorder Then
BaseTop = Poss(ii).Top
BaseLeft = Poss(ii).Left
SecondLeft = BaseLeft + Poss(ii).Width
Exit For
End If
Next ii
'lZOrder+1と同じZorderのShapeの情報を編集する
For ii = 1 To lMax
If Poss(ii).ZOrderPosition = lZorder + 1 Then
Poss(ii).Top = BaseTop
Poss(ii).Left = SecondLeft
Exit For
End If
Next ii
End Sub
図形を複数選択した状態で起動します。
解説
図形の重なっている順はZOrderPositionというプロパティを見れば分かります。
図形の整列にはDistributeメソッドを使うことが多いのですが、今回はZOrder順という条件があるので、ちょっとまどろっこしいFor文がいくつか入っています。
AlignTwoShapesは、図形を2個ずつZOrder順に処理するプロシージャです。
ShapesのTopとLeftの値をいじることで整列させています。
本当はこれで終わりでもよかったのですが、ダメ押しで最後にDistributeで整列させています。
-
前の記事
就業規則が有効となるためには 2023.03.22
-
次の記事
【Excel】関数だけでグループ化 2023.03.24