【VBA】パワポの図形を重なっている順に整列させるには【PowerPoint】

Yahoo!知恵袋の質問に答えた中から紹介します。PowerPointVBAです。図形を整列させたいのですが、条件があって、重なっている順に左から並べたいというものです。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13277117603

パワポのマクロを教えてください。
選択した重なっている画像を、
重ならないように横に並べるマクロを作りたいのですが、
どのように組めばいいでしょうか。

希望としては、
マクロ実行前に下から並んでいる順に、
マクロ実行後には左から並んであるということをやりたいです。

添付例でいうと、
□×〇が正解で、○×□とはしたくないということです。

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で整列させています。