Powerpoint vba:将形状对象属性应用于选择

Powerpoint vba: Apply shape object properties to selection

我想要运行一个允许执行以下步骤的宏:

  1. 用户点击形状 A 和 运行s 宏
  2. 宏会记录形状A的位置和大小属性

  3. 用户在另一张幻灯片上单击形状 B

  4. 宏将形状 A 的位置和大小属性应用到形状 B
  5. 用户在另一张幻灯片上点击形状 C
  6. 宏将形状 A 的位置和大小属性应用到形状 C 等...

到目前为止,我已经能够获得初始形状(形状 A)的属性,但不确定如何让用户 select 获得下一个形状。

Dim w As Double
Dim h As Double
Dim l As Double
Dim t As Double

With ActiveWindow.Selection.ShapeRange(1)
    w = .Width
    h = .Height
    l = .Left
    t = .Top
End With

感谢您的帮助!


答案见下文。如果您以前没有使用过表单(像我一样),则不应将以 "Private Sub CommandButton1_Click()" 开头的代码插入同一模块中。转到插入 > 用户窗体,然后将两个命令按钮拖到 UI 框上,然后应该会出现另一个 "Userform code" window。新 window 是 "Private Sub CommandButton1_Click()" 代码应该去的地方。

我想您在为此使用点击事件时会遇到麻烦。我建议创建宏并将它们存储在快速访问工具栏上。在那里,键盘快捷键是 ALT+SOME NUMBER,可以快速使用。

对于代码,一般的想法是创建具有 global 范围的变量。这允许它们在 Sub 完成执行后保留它们的值。

在下面的代码中,StoreDetails 将保存,OutputDetails 将应用于新选择的对象。保存的信息将保留在那里,这样您就可以从 A 保存然后申请 B、C、D,而无需再次看到 A。

Module1 中的代码

Dim w As Double
Dim h As Double
Dim l As Double
Dim t As Double

Sub StoreDetails()
    With ActiveWindow.Selection.ShapeRange(1)
        w = .Width
        h = .Height
        l = .Left
        t = .Top
    End With
End Sub

Sub OutputDetails()
    With ActiveWindow.Selection.ShapeRange(1)
        .Width = w
        .Height = h
        .Left = l
        .Top = t
    End With
End Sub

这里有一篇关于 assigning macros to the Quick Access Toolbar 的文章,如果你需要帮助。

一种方法如下:

在模块中:

Public aShapes() As Shape

Sub RecordShapes()

    ReDim aShapes(1 To 1)
    Dim x As Long

    Set aShapes(1) = ActiveWindow.Selection.ShapeRange(1)

    ' the modeless form will allow the user to move from slide to slide
    ' selecting shapes as they wish
    UserForm1.Show vbModeless

End Sub

在窗体上,两个按钮;一个将当前选定的形状添加到您正在收集的形状数组中,另一个将第一个形状的参数应用到添加的选定形状。

Private Sub CommandButton1_Click()

    ReDim Preserve aShapes(1 To UBound(aShapes) + 1)
    Set aShapes(UBound(aShapes)) = ActiveWindow.Selection.ShapeRange(1)

End Sub
Private Sub CommandButton2_Click()

    Dim x As Long
    For x = 2 To UBound(aShapes)
        aShapes(x).Left = aShapes(1).Left
        aShapes(x).Width = aShapes(1).Width
        ' etc
    Next

End Sub

您需要添加错误检查以确保当用户单击任何按钮时选择了某些内容,并且他们在选择第一个形状后至少向数组添加了一个形状,并且您可能也想处理多个选定的形状。