您可以使用如下命令对形状进行分组:
Dim ws as Worksheet
Set ws = ActiveSheet ' <-- Set to the worksheet you are working on
ws.Shapes.Range(Array("Heart 1", "Sun 2", "Star 3")).Group
(您可以通过名称或索引访问形状)。 group 命令的结果是添加到工作表的另一个形状。但请注意,分组形状仍然存在于工作表中,您可以使用 GroupItems-property 访问它们。
With ws.Shapes
Dim shGroup As Shape, sh As Shape
Set shGroup = .Range(Array("Heart 1", "Sun 2", "Star 3")).Group
shGroup.Name = "MyNewGroup" & .Count
For Each sh In shGroup.GroupItems
Debug.Print sh.Name, sh.Type
Next sh
End With
如您所见,单个形状元素不会更改其名称,因此分组不会解决您的命名问题。唯一的方法是在名称中添加后缀,例如一个数字(就像 Excel 在创建形状时所做的那样)。
更新:当然Array- 参数不需要是静态的。你可以声明一个足够大的数组(它是否包含一些空元素并不重要)。
Const maxShapes = 12
Dim myShapes(1 to maxShapes) as String
myShapes(1) = *Name of first shape you created*
myShapes(2) = *Name of second shape you created*
...
ws.Shapes.Range(myShapes).Group
或使用Redim 命令:
Dim myShapes() as String
Redim myShapes(1 to NumberOfShapesInYourNewGroup)
myShapes(1) = *Name of first shape you created*
myShapes(2) = *Name of second shape you created*
...
ws.Shapes.Range(myShapes).Group
要获得唯一的形状和组名,您可以实现各种方法。我不喜欢使用全局变量的尝试,因为它们可能会被重置 - 例如,当您在调试期间取消执行时。例如,您可以使用 Excel 在创建新形状时生成的后缀。或者将重命名语句放入一个循环中,在重命名之前放一个On error Resume Next(不要忘记在它后面放一个On error Goto 0)并循环直到重命名成功。或遍历工作表中的所有形状以查找下一个免费名称。