【问题标题】:How do I group a set of shapes programmatically in excel 2007 vba?如何在 excel 2007 vba 中以编程方式对一组形状进行分组?
【发布时间】:2011-06-05 20:40:40
【问题描述】:

我正在迭代电气表工作表上的数据并在形状工作表上创建形状。创建形状后,我想以编程方式对它们进行分组。但是我无法弄清楚正确的语法。形状在那里,被选中,如果我单击分组按钮,它们会完美分组。但是使用以下代码我得到了

运行时错误 438 对象不支持此方法或属性。

我将此代码基于网络上的 VBA 示例 - 我不是一个强大的 VBA 程序员。这样做的正确方法是什么?我正在使用 excel 2007,不能选择切换 excel 版本。

有问题的 sn-p:

Set shapeSheet = Worksheets("Shapes")

With shapeSheet
    Selection.ShapeRange.Group.Select
End With

上下文:

Dim shapeSheet As Worksheet
Dim tableSheet As Worksheet
Dim shpGroup As Shape

Set shapeSheet = Worksheets("Shapes")
Set tableSheet = Worksheets("Electrical Tables")


With tableSheet
    For Each oRow In Selection.Rows
            rowCount = rowCount + 1
            Set box1 = shapeSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 50, 50 + ((rowCount - 1) * 14), 115, 14)
            box1.Select (False)
            Set box1Frame = box1.TextFrame
            Set box2 = shapeSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 165, 50 + ((rowCount - 1) * 14), 40, 14)
            box2.Select (False)
            Set box2Frame = box2.TextFrame
     Next
End With

Set shapeSheet = Worksheets("Shapes")

With shapeSheet
    Selection.ShapeRange.Group.Select
End With

【问题讨论】:

    标签: excel vba shapes


    【解决方案1】:

    不用先选择,直接使用

    Set shpGroup = shapeSheet.Shapes.Range(Array(Box1.Name, Box2.Name)).Group
    

    PS。您收到错误的原因是选择对象指向工作表上选择的任何内容(不是刚刚创建的形状)很可能是 RangeRange 没有Shapes 财产。如果您碰巧在工作表上有其他形状并且它们被选中,那么它们将被分组。

    【讨论】:

    • Funny:我以为我试过了,但没用。我错了。多哈。 +1
    • 丑陋,但似乎是创建 ShapeRange 的唯一方法。
    【解决方案2】:

    这在 Excel 2010 中对我有用:

    Sub GroupShapes()
    
        Sheet1.Shapes.SelectAll
        Selection.Group
    
    End Sub
    

    我在工作表 1 上有两个形状,它们在调用上述方法之前未分组,在之后分组。

    编辑

    使用索引选择特定形状:

    Sheet1.Shapes.Range(Array(1, 2, 3)).Select
    

    使用名称:

    Sheet1.Shapes.Range(Array("Oval 1", "Oval 2", "Oval 3")).Select
    

    【讨论】:

    • 感谢您的指点。 Selection.Group 在 Excel 2007 中似乎没有做任何事情。形状表上可能已经有其他形状,因此调用 SelectAll 没有用。
    • @Andrew,很奇怪Group 在 Excel 2007 中不起作用。我明天上班时必须进一步测试。 (我有 Office 2007。)另外,SelectAll 是我选择多个形状的一种快速方法。对于您的情况,您可能希望使用 Shapes 对象的 Range 属性。我会更新我的答案...
    • @Andrew:实际上:查看 chris neilsen 的答案。它非常适合您正在做的事情。只需将 Box1.Name 替换为您的 TextBox 变量(无论有多少),您就可以开始使用了。
    • (以上评论假设您能够让 Group 方法工作。)
    • 谢谢尼克 - 我缺少的一点是在尝试使用工作表的选择之前执行 shapeSheet.Activate。组确实有效 - 感谢您向我展示正确的语法。
    【解决方案3】:

    您可以通过以下方法轻松地将 所有 形状分组到工作表上,而无需您 Select 任何东西:

    ActiveSheet.DrawingObjects.Group
    

    如果您认为/知道当前工作表上的任何形状已经分组,那么您需要首先Ungroup这些形状:

    ActiveSheet.DrawingObjects.Ungroup  'include if groups already exist on the sheet
    ActiveSheet.DrawingObjects.Group
    

    我知道这个答案有点离题,但添加了它,因为所有对 Excel 形状分组的搜索都倾向于指向这个问题

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,但需要选择几个形状(之前由宏创建并列在形状数组中),但不是“select.all”,因为幻灯片上可能还有其他形状。

      shaperange 的创建并不容易。 最简单的方法是循环遍历形状对象(如果您已经知道它们)并使用选项“Replace:=False”模拟“按住 ctrl 键”来选择它们。

      这是我的代码:

      For ix = 1 To x
          bShp(ix).Select Replace:=False
      Next
      ActiveWindow.Selection.ShapeRange.Group
      

      希望对您有所帮助, 克里。

      【讨论】:

      【解决方案5】:

      我可以在这里看到很多解决方案,但我想与您分享我在不知道形状名称或编号且不使用ActiveSheetSelect 的情况下处理此主题的方法。

      下面的代码将对设置工作表上的每个形状进行分组。

      Dim arr_txt() As Variant
      Dim ws As Worksheet
      Dim i as Long
      
      set ws = ThisWorkbook.Sheets(1)
      
      With ws
          ReDim arr_txt(1 To .Shapes.Count)
          For i = 1 To .Shapes.Count
              arr_txt(i) = i 'or .Shapes(i).Name
          Next
          .Shapes.Range(arr_txt).Group
      End With
      

      【讨论】:

      • 我赞成您的解决方案,因为它不依赖于繁重的Select
      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多