【问题标题】:Dynamic labelling of shapes形状的动态标记
【发布时间】:2017-07-25 23:16:43
【问题描述】:

我正在 For 循环中创建形状,我希望每个形状都有不同的名称。因此,每次迭代中Set Shape = ... 中的Shape 应将Shape 替换为动态变量。

如果我通过Set Shape = w.Shapes.AddShape(msoShapeRectangle, 10,10,10,10) 放置形状,我怎么能让Shape(形状的名称)是动态的,例如Set Cells(1 + i, 1) = w.Shapes.AddShape(msoShapeRectangle, 10,10,10,10) ... 这样每个形状都有不同的名称。我还尝试了Shape.Name =,这似乎与在创建形状时设置名称的效果不同。

我为在循环中创建的每个形状指定一个名称: Shape.Name = Cells(GanttStartRow + i, 1) & Cells(GanttStartRow + i, 2)

我通过设置连接器 Set conn = w.Shapes.AddConnector(msoConnectorElbow, 1, 1, 1, 1) conn.ConnectorFormat.BeginConnect D, 1 conn.ConnectorFormat.EndConnect WP, 1 ...但收到“类型不匹配”错误。

【问题讨论】:

  • 你的问题中的Cells() 应该是一个形状数组吗?如果是这样,这是一个奇怪的名称选择,它覆盖了 VBA 编程中Cells() 的标准含义。如果不是,我不知道您要做什么,因为您无法将单元格设置为等于形状。您是否尝试将新添加的形状的名称放入单元格中?

标签: vba excel


【解决方案1】:

假设 ws 是您正在使用的工作表:

Dim s As Shape, i as integer
for i = 1 to 5
    Set s = ws.Shapes.AddShape(msoShapeRectangle, 50 + i * 120, 200, 100, 100)
    s.Name = "MyShapeName" & i
next i

您以后可以按名称访问形状:

For i = 1 To 5
    Set s = ws.Shapes("MyShapeName" & i)
    s.Fill.BackColor.RGB = RGB(0, 255 - i * 50, i * 50)
    s.BackgroundStyle = i
Next i

但是,另一种方法是遍历所有形状:

For Each s In ws.Shapes
    Dim i As Integer
    if left(s.Name, 1, 11) = "MyShapeName" then
        i = Val(Mid(s.Name, 12))
        s.Top = s.Top + i * 4
    end if
Next s

【讨论】:

  • 感谢您的评论。我试过Shape.Name = Cells(GanttStartRow + i, 1) & Cells(GanttStartRow + i, 2)。但是,稍后当我想连接我的形状时,我无法引用它们的名称,但我可以引用“形状”
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多