【问题标题】:Unable to Group some shapes in Powerpoint 2010无法在 Powerpoint 2010 中对某些形状进行分组
【发布时间】:2015-08-05 05:00:55
【问题描述】:

我在 ShapeRange 上使用 .Group 方法时遇到了一些困难。

例如,我无法将表格与文本框组合在一起,也无法将幻灯片的标题形状与文本框组合在一起,等等。我注意到 Powerpoint 不允许您将某些形状组合在一起,因为“组”选项在上下文菜单中被禁用:

我在 VBA 中尝试了以下操作,但不出所料地失败了:

Sub TestGroupShapes()

    Dim sld As slide
    Dim tb As Shape
    Dim tb2 As Shape
    Dim tbl As Shape

    Set sld = ActivePresentation.Slides(1)
    Set tbl = sld.Shapes.AddTable(3, 3, 100, 100, 100, 100)
    tbl.Name = "Table"
    Set tb = sld.Shapes.AddTextbox(msoTextOrientationHorizontal, 200, 200, 50, 50)
    tb.Fill.Visible = msoCTrue
    tb.Name = "TextBox1"
    Set tb2 = sld.Shapes.AddTextbox(msoTextOrientationHorizontal, 300, 300, 50, 50)
    tb2.Fill.Visible = msoCTrue
    tb2.Name = "TextBox2"

    '## This works. I am able to group two textbox shapes together:
    sld.Shapes.Range(Array(tb2.Name, tb.Name)).Group

    '## This fails, I am not able to group a shape with a Table
    '   Also fails, e.g., if I try to group with the slide's Title shape, etc.
    sld.Shapes.Range(Array(tbl.Name, tb.Name)).Group


End Sub

我可以使用其他方法将某些形状“绑定”在一起吗?

2013 年 5 月 25 日更新

问题是用户可能复制的形状(Ctrl+V/etc)与原始形状保持相同的.Name。我正在开发的应用程序为其创建的形状分配唯一的 ID,但如果用户复制它们,这些 ID 将不会保持唯一。例如,某些用户可能会“复制”现有的文本框,而不是插入 new 文本框。

由于应用程序需要维护和更新形状(表格、文本框、图表等),通过“复制”现有形状创建的任何形状都可能导致问题,因为我的应用程序将不再能够确定要更新、删除等的形状。

我希望做的是Group他们在一起。虽然它不是故障安全(用户仍然可以手动Ungroup他们,但我觉得这至少是一个额外的安全保障。

【问题讨论】:

  • 我喜欢你的问题......不幸的是,我认为对表格进行分组是不可行的:(
  • 我发现 :) 我很奇怪无法对表格和其他形状进行分组,或者某些形状无法使用这种方法,但我找不到关于哪些形状不能分组,或者为什么不能分组:(

标签: vba powerpoint


【解决方案1】:

无法将某些形状组合为一个形状。但是您可以使用 ShapeRange 将不同类型的形状联系在一起。然后可以在它自己的形状范围上设置一些属性,在特定项目上设置另一个属性。高温

Sub test()

    Dim tableShape As Shape
    Dim textboxShape1 As Shape
    Dim textboxShape2 As Shape
    Dim myShapeRange As ShapeRange

    With ActivePresentation.Slides(1)
        Set tableShape = .Shapes.AddTable(3, 3, 100, 100, 100, 100)
        tableShape.Name = "Table"

        Set textboxShape1 = .Shapes.AddTextbox(msoTextOrientationHorizontal, 200, 200, 50, 50)
        textboxShape1.Name = "TextBox1"

        Set textboxShape2 = .Shapes.AddTextbox(msoTextOrientationHorizontal, 300, 300, 50, 50)
        textboxShape2.Name = "TextBox2"

        Set myShapeRange = .Shapes.Range(Array("Table", "TextBox1", "TextBox2"))
    End With

    Call FormatShapes(myShapeRange)

End Sub

Private Sub FormatShapes(inputShapeRange As ShapeRange)
    Dim shapeItem As Shape

    With inputShapeRange
        .Align msoAlignLefts, msoFalse
        .AlternativeText = "My group 123"
    End With

    For Each shapeItem In inputShapeRange
        With shapeItem
            .Fill.Visible = msoTrue
            .Fill.Solid
            .Fill.ForeColor.RGB = RGB(255, 0, 0)
            .Fill.TwoColorGradient msoGradientHorizontal, 1
        End With
    Next shapeItem
End Sub

【讨论】:

  • +1 但不是我真正想要的。我尝试将形状组合在一起的原因更多地与最终用户体验有关,而不是我的脚本如何与形状交互。
  • 啊哈,我明白了。也许您可以调用 myShapeRange.Select ? ...但不知道这对用户是否有用。
  • 也不认为这真的有效。我已经更新了我的 Q 以更彻底地描述我正在尝试做的事情,以及为什么。任何其他建议(即,我可以用 Class 模块或WithEvents 等做的事情)?
【解决方案2】:

当您无法对物品进行分组时,就会出现某种故障。请按照以下步骤“重新激活群组功能”。看看这是否对您有帮助:

  1. 在您的演示文稿中添加一张新幻灯片(您可以稍后将其删除)
  2. 插入三种不同颜色的三种形状
  3. 排列形状以尝试分组(应该返回分组功能)
  4. 如果它没有返回,临时解决方法是右键单击您选择的 3 个项目,然后选择“图片”粘贴选项(看起来像剪贴板和图片图标),这也应该将项目组合在一起。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    这是一个很长的路要走,但它会起作用(至少它对我有用,:D)。

    您需要做的是制作表格,然后分别右键单击它们;您想要做的是将您的表格保存为图片(因为 JPEG 非常适合此)到您的桌面或其他一些方便的文件。然后将您的表格(以图片形式)放回幻灯片中。您现在应该可以将所有东西组合在一起了。

    这是一个 PITA,但至少它会起作用。祝你好运!

    【讨论】:

    • 这很难解决编码问题。
    • 这不是一个可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2014-10-09
    相关资源
    最近更新 更多