处理形状(图形对象)

形状(图形对象)由三种不同的对象表示:Shapes 集合、ShapeRange 集合和 Shape 对象。 一般而言, Shapes 集合可用于创建形状和遍历幻灯片上的所有形状; Shape 对象可用于修改单个形状; ShapeRange 集合可用于修改多个形状,就像在用户界面中处理多个选定形状一样。

设置形状的属性

形状的许多格式属性不是由直接应用于 ShapeShapeRange 对象的属性设置的。 而相关的形状属性在第二级对象内进行组合,例如 FillFormat 对象,其中包含了与形状填充相关的所有属性;又如 LinkFormat 对象,其中包含了链接的 OLE 对象特有的所有属性。 要设置形状的属性,必须先返回代表相关形状属性集的对象,然后设置该返回的对象的属性。 例如,使用 Fill 属性返回 FillFormat 对象,然后设置 FillFormat 对象的 ForeColor 属性,从而设置指定形状的前景填充色,如以下示例所示。

Set myDocument = ActivePresentation.Slides(1)
myDocument.Shapes(1).Fill.ForeColor.RGB = RGB(255, 0, 0)

同时对多个形状应用属性或方法

在用户界面中,有些操作可以对选定的多个形状执行;例如,可以选定多个形状并同时设置它们各自的填充。 其他些操作则只能对选定的单个形状执行;例如,只有选定单个形状时才能编辑其中的文本。

在 Visual Basic 中,对一组形状应用属性和方法有两种方式。 这两种方式使您可以对若干形状执行在单个形状上能执行的所有操作,而不管是否可以在用户界面上执行这些操作。

  • 如果该操作在用户界面上影响多个选定的形状,则要在 Visual Basic 中执行该操作时,只需先建立一个包含要使用的形状的 ShapeRange 集合,然后直接对该 ShapeRange 集合应用适当的属性和方法。

  • 如果不能在用户界面上对多个选定的形状同时执行某个操作,则仍然可以在 Visual Basic 中通过以下方法来执行该操作:遍历包含要处理的形状的 Shapes 集合或 ShapeRange 集合,对集合中每个单独的 Shape 对象应用适当的属性和方法。

许多应用于 Shape 对象和 ShapeRange 集合的属性和方法在用于某些特定形状时会失败。 例如,如果将 TextFrame 属性应用于不能包含文本的形状,将会失败。 如果不确定能否将特定的属性或方法应用于 ShapeRange 集合中的每个形状,则不要对 ShapeRange 集合应用该属性或方法。 如果要对形状集合应用一个这样的属性或方法,则必须在应用之前逐个测试集合中的每个形状,以确保形状的类型与所应用的属性或方法相匹配。

对 ShapeRange 集合应用属性或方法

如果可以同时在用户界面上对多个选定的形状执行某种操作,则可以通过编程的方式创建一个 ShapeRange 集合,再应用适当的属性和方法以执行该操作。 以下示例将在 myDocument 上构建一个形状范围,其中包含名为“Big Star”和“Little Star”的自选图形,并向其应用渐变填充。

Set myDocument = ActivePresentation.Slides(1) 
Set myRange = myDocument.Shapes _ 
    .Range(Array("Big Star", "Little Star")) 
myRange.Fill.PresetGradient msoGradientHorizontal, _ 
    1, msoGradientBrass

以下是对 ShapeRange 集合应用属性和方法时其行为方式的常规准则。

  • 向集合应用方法的操作相当于向该集合中每个单独的 Shape 对象应用方法。

  • 设置集合的属性值等于设置该范围内每个形状的属性值。

  • 如果集合中所有形状的某一返回常数的属性值相同,则集合的该属性将返回单个形状的该属性值。 如果集合中所有形状的该属性值不相同,则返回"mixed"常数。

  • 如果集合中所有形状的某一返回简单数据类型的属性值相同(例如 LongSingleString),集合的该属性将返回单个形状的该属性值。

  • 有些属性值仅当集合中有且只有一个形状时才能返回或设置。 如果集合中有一个以上的形状,将发生运行时错误。 此情况通常发生在用户界面中与返回或设置属性等价的操作不能同时对多个形状进行时(例如,编辑形状中的文本或编辑任意多边形的点)。

设置在 ShapeRange 集合的辅助对象(例如 FillFormat 对象)下分组的形状的属性时,前面的准则也适用。 如果辅助对象表示可以在用户界面中的多个选定对象上执行的操作,则可以从 ShapeRange 集合返回该对象并设置其属性。 例如,可以使用 Fill 属性返回 FillFormat 对象,该对象表示 ShapeRange 集合中的所有形状的填充。 设置 FillFormat 对象的属性后,将同时设置 ShapeRange 集合中的所有单个形状的相同属性。

遍历 Shapes 或 ShapeRange 集合

即使不能在用户界面上通过选择多个形状并执行某一命令来对这些形状同时进行某一操作,也可以通过以下过程以编程方式来执行该操作:遍历包含要处理的形状的 Shapes 集合或 ShapeRange 集合,对集合中的各个 Shape 对象应用适当的属性和方法。 以下示例将遍历 myDocument 上的所有形状,并向属于自选图形的每个形状添加文本。

Set myDocument = ActivePresentation.Slides(1) 
For Each sh In myDocument.Shapes 
    If sh.Type = msoAutoShape Then 
        sh.TextFrame.TextRange.InsertAfter " (version 1)" 
    End If 
Next

以下示例创建包含当前窗口中所有选定形状的 ShapeRange 集合,并为集合中每个能够包含文本的形状设置文本。

For Each sh in ActiveWindow.Selection.ShapeRange
    If sh.HasTextFrame Then
        sh.TextFrame.TextRange = "Initially selected"
    End If
Next

在形状区域中对齐、分布、组合形状

使用 AlignDistribute 方法可定位多个形状的相互位置或相对于包含它们的文档的位置。 使用 Group 方法或 Regroup 方法可根据多个形状创建一个组合形状。

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。