Меняем объекты местами (макрос)

Один знакомый макрописатель попросил подсказать с одним кодом, в итоге "подсказка" получилась в виде готового макроса.

Option Explicit 
Declare Function GetKeyState& Lib "user32" (ByVal vKey&) 

Sub SwapShapes() 
    Dim sr As ShapeRange 
    Set sr = ActiveSelectionRange 
    If sr.Count = 2 Then 
        ActiveDocument.ReferencePoint = cdrCenter 
         
        Dim b As Boolean 
        If (GetKeyState(vbKeyShift) And &HFF80) <> 0 = True Then b = True 
         
        Dim s1 As Shape, s2 As Shape, st As Shape 
        Set s1 = sr(1): Set s2 = sr(2) 
         
        Dim x#, y#, w#, h# 
         
        Set st = s1.Duplicate 
        s2.GetPosition x, y 
        If b Then s2.GetSize w, h 
        s1.SetPosition x, y 
        If b Then s1.SetSize w, h 
        s1.OrderBackOf s2 
         
        st.GetPosition x, y 
        If b Then st.GetSize w, h 
        s2.SetPosition x, y 
        If b Then s2.SetSize w, h 
        s2.OrderBackOf st 
         
        st.Delete 
    End If 
End Sub

Макрос меняет два выделенных объекта местами.
Если во время запуска макроса удерживать Shift, то обмен произойдёт не только положением но и размерами.

П.С. Оформлять в отельный GMS некогда и лень )))
Если у кого есть время, оформите сами и выложите здесь.

Как вариант есть еще и такой старый макрос SwapShapes.
http://cdrpro.ru/forum/13-545-1
Меняет много объектов, но не меняет размер

не поняла, зачем duplicate - delete

s1.GetPosition x1, y1
s2.GetPosition x2, y2
s1.SetPosition x2, y2
s2.SetPosition x1, y1

ekali, потому что объекты меняются не только координатами X и Y, но и Z тоже.

Да, упустила, спасибо.