形状或绘图对象由三种不同的对象表示:Shapes 集合、ShapeRange 集合和 Shape 对象。通常,Shapes 集合用于创建形状并对幻灯片中的所有形状进行重复操作;Shape 对象用于修改单个形状;而 ShapeRange 集合用于修改多个形状,就象在用户界面中使用多个选定的形状一样。
一、设置形状的属性
形状的许多格式属性不是由直接应用于 Shape 或 ShapeRange 对象的属性设置的。相反,相关的形状属性在第二级对象内进行组合。例如 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”常数。
如果集合中所有形状的某一返回简单数据类型的属性值相同(例如 Long、Single 或 String),集合的该属性将返回单个形状的该属性值。
有些属性值仅当集合中有且只有一个形状时才能返回或设置。如果集合中有一个以上的形状,将发生运行时错误。此情况通常在用户界面中的等价操作只能用于单个形状时(例如,编辑形状中的文本或编辑任意多边形的点)发生。
设置组合在 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