2017-07-25 70 views
0

我在For-loop中创建形状,并且我想让每个形状具有不同的名称。因此,每个迭代中的ShapeSet 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设置连接器...但收到一个“类型不匹配”错误。

+0

在你的问题'Cells()'应该是一个形状数组?如果是这样,那么这是一个在VBA编程中覆盖'Cells()'的标准含义的名称的奇怪选择。如果没有,我不知道你在做什么,因为你不能设置一个单元格等于一个形状。你是否试图将新添加的形状的名称放入单元格中? –

回答

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 
+0

谢谢你的评论。我尝试过'Shape.Name = Cells(GanttStartRow + i,1)&Cells(GanttStartRow + i,2)'。然而,后来当我想连接我的形状时,我不能引用他们的名字,但我可以参考'形状' – Jonas