动态标记形状

时间:2017-07-25 14:10:15

标签: vba excel-vba excel

我在For-loop中创建形状,我希望每个形状都有不同的名称。因此,每次迭代中Shape中的Set 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 ...但收到"类型不匹配"错误。

1 个答案:

答案 0 :(得分:2)

假设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