按照ID或名称获取形状

6

如果你知道一个形状的Id,有没有办法获取它的形状?

例如:

Dim myshape As Shape
myshape.Id = 42
myshape = getShapeById(myshape.Id)

或者,我能通过Name获取形状吗?
Dim myshape As Shape
myshape.Name = "Rectangle 42"
myshape = getShapeByName(myshape.Name)
4个回答

5

通过其.Id获取形状.Name通过其.Name获取.Id要更加复杂一些。

但是这是如何完成的:

Sub PrintShapeName()
    Debug.Print getNameByID(3, 1)
End Sub

Function getNameByID(shapeID As Long, slide As Integer)
    Dim ap As Presentation: Set ap = ActivePresentation
    Dim sl As slide: Set sl = ap.Slides(slide)
    sl.Shapes.SelectAll
    Dim sr As ShapeRange
    Set sr = Windows(1).Selection.ShapeRange
    Dim s As Shape
    For Each s In sr
        If s.id = shapeID Then
            getNameByID = s.Name
            Exit Function
        End If
    Next
End Function

4
要通过 Name 获取一个 Shape,你需要执行以下步骤...:
Function getShapeByName(shapeName As String, Slide As Integer)
    Set getShapeByName = ActivePresentation.Slides(Slide).Shapes(shapeName)
End Function

Dim myshape As Shape
myshape = getShapeByName("Rectangle 42", 1)

我以为我已经在 https://dev59.com/RlXTa4cB1Zd3GeqP3qr6 中回答了这个问题,现在你想要相反的操作(通过 .Id 获取形状),就像我的帖子中所示。 - Todd Main
@Otaku 是的,但直到现在我才真正理解了代码。 :) - Mateen Ulhaq
如果该对象不存在怎么办?在访问VBA中的某物之前,我应如何检查? - paskl
@paskl 你的意思是如果名称不存在吗?也许是这样的:http://pastebin.com/1Fk8WQCB - Mateen Ulhaq

0

不确定是按ID还是按名称,但可以使用sheet Shapes集合对象

Set myShape = <SheetObject>.Shapes("<ShapeName>")

例如

Set myShape = ActiveSheet.Shapes("Rectangle 1")

1
我现在正在查看 ActivePresentation.Slides(Slide).Shapes(),看起来很有前途... - Mateen Ulhaq

-1
sName = ActivePresentation.Slides(k).Shapes(j).Name

其中k是幻灯片编号,j是该幻灯片上的形状编号。

您可以使用以下类似的方法循环遍历每个页面的形状:

k = 1
For j = 1 To ActivePresentation.Slides(k).Shapes.Count
Next j

Chris


问题是关于Shape.Id而不是Shape编号,因为Shape.ID是在幻灯片中唯一标识形状的唯一字段。 - Chandraprakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接