【问题标题】:select multiple figures in a series using excel visual basic使用 excel visual basic 选择系列中的多个图形
【发布时间】:2016-02-03 20:19:12
【问题描述】:

使用 excel visual basic,我想重复选择多个图形并将它们分组。

我的代码是这样的:

circleCnt = 5

For j = 1 To circleCnt

    ActiveSheet.Shapes.AddShape(msoShapeOval, 500, 30, 40, 30).Select
    Selection.ShapeRange.Height = minWidth + circleWidth * (circleCnt - j + 1)
    Selection.ShapeRange.Width = minWidth + circleWidth * (circleCnt - j + 1)
    Selection.ShapeRange.IncrementLeft circleWidth / 2 * (j - 1) + circleWidth / 2
    Selection.ShapeRange.IncrementTop circleWidth / 2 * (j - 1) + circleWidth / 2

    Next j

是的,它正在绘制多个圆圈,我正在尝试使用这些代码呈现我的数据。问题是......我的完整数据制作了一百多个圆圈,并且将所有圆圈转移到PowerPoint中需要很长时间

我想将样本中的圆圈组成一个组 - 如何选择多个形状对象?我在想

for n = 1 to 5

    select shape #n

    next n

但正如您所见,这不起作用

是否有任何“累积”代码可供选择?还是选择最后一个对象并将它们组合成一组先前分组的对象?

-我不想将“所有圈子”归为一组 - 一个样本组,有多个样本:)

【问题讨论】:

  • ActiveSheet.Shapes.Range(Array("Oval 2", "Oval 3")).Select Selection.ShapeRange.Group.Select
  • 感谢您对 Siva 的评论,但我想把它变成一个可宏的代码,而不是一个一个

标签: vba selection shape


【解决方案1】:

添加形状后,您需要遍历工作表上的所有形状并将形状名称存储在数组中。使用它,您可以创建ShapeRange 对象和Group 形状。这是一个代码示例:

Sub GroupAllShapes()

    Dim arrShapeNames()     As Variant 'must be Variant to work with Shapes.Range()
    Dim shp                 As Shape
    Dim sr                  As ShapeRange
    Dim ws                  As Worksheet
    Dim i                   As Integer

    Set ws = ActiveSheet

    ReDim arrShapeNames(ws.Shapes.Count - 1)
    i = 0
    For Each shp In ws.Shapes
        arrShapeNames(i) = shp.Name
        i = i + 1
    Next

    Set sr = ws.Shapes.Range(arrShapeNames)
    sr.Group

    Set sr = Nothing
    Set ws = Nothing

End Sub

注意:我从我的一些 C# 代码中移植了它,并让 arrShapeNames 数组具有从零开始的索引。对于 VBA,您可能需要使其从 1 开始。

【讨论】:

  • 非常感谢 Nick,我不熟悉 excel 中的 VBA,所以不知道“shaperange”以及如何使用它 - 这真的很有帮助!
  • 还有一件事,是否可以选择几个形状并将它们分组?比如说:
     for n = 3 to 8
    sr = ws.Shapes.Range(arrShapeNames(n))
    next n
    将第 3 到第 8 个创建的形状归为一组? -我怎样才能改变线路?抱歉乱写了
【解决方案2】:

尽量避免选择代码中的任何内容。这使您的代码非常慢。我不完全清楚您要做什么,但请尝试以下操作:

dim objShape as Shape

for j = 1 To circleCnt

    set objShape = Shapes.AddShape(msoShapeOval, 500, 30, 40, 30)

    With objShape
        .ShapeRange.Height = minWidth + circleWidth * (circleCnt - j + 1)
        .ShapeRange.Width = minWidth + circleWidth * (circleCnt - j + 1)
        .ShapeRange.IncrementLeft circleWidth / 2 * (j - 1) + circleWidth / 2
        .ShapeRange.IncrementTop circleWidth / 2 * (j - 1) + circleWidth / 2
    End With

next

set objShape = Nothing

【讨论】:

  • 感谢 RobK 的评论,抱歉我的解释有限
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多