图形,或者说绘图对象,可由三种不同类型的对象来代表:Shapes 集合、ShapeRange 集合和 Shape 对象。通常情况下,可用 Shapes 集合创建图形并在给定工作表上的所有图形中进行循环;可用 Shape 对象修改单个图形或设置其格式;而用 ShapeRange 集合可同时修改多个图形,就像在用户界面上处理多个图形一样。
图形的许多格式属性不是由直接应用于 Shape 对象或 ShapeRange 对象的属性设置的。实际情况是,相关的图形属性被组合到了第二级对象之下,例如包含所有关于图形填充格式的属性的 FillFormat 对象,或包含所有对链接的 OLE 对象为唯一的属性的 LinkFormat 对象。若要设置图形的属性,就必须先返回代表一组相关图形属性的对象,然后设置返回对象的属性。例如,使用 Fill 属性返回 FillFormat 对象,然后再设置 FillFormat 对象的 ForeColor 属性来设置指定图形的填充前景色,如下例所示。
Worksheets(1).Shapes(1).Fill.ForeColor.RGB = RGB(255, 0, 0)
在用户界面上,可以对若干选定图形执行某些操作。例如,可以选定若干图形并同时设置每个图形的填充格式。但有些操作只能对单个选定图形执行。例如,一次只能编辑一个图形中的文本(如果选定一个图形)。
在 Visual Basic 中,可用两种方式对一组图形应用属性和方法。用这两种方式,可将任何可在单个图形上执行的操作用于若干图形,而不论该操作是否可在用户界面上执行。
许多应用于 Shape 对象和 ShapeRange 集合的属性和方法,在应用于特定类型的图形时将失败。例如,将 TextFrame 属性应用于不能包含文本的图形时,该属性就将失败。如果不能确定 ShapeRange 集合中的每个图形是否都能应用某一特定的属性或方法,就不要对 ShapeRange 集合应用该属性或方法。如果要对某一图形集合应用这些属性或方法之一,就必须在该集合中循环,并在对每个图形应用该属性或方法之前,检测该图形是否属于能够应用该属性或方法的类型。
通过选定图形,然后使用 ShapeRange 属性来返回包含选定图形的 ShapeRange 对象,可创建包含工作表上所有 Shape 对象的 ShapeRange 对象。
Worksheets(1).Shapes.Select
Set sr = Selection.ShapeRange
在 Microsoft Excel 中,Shapes 集合的 Range 属性的 Index 参数不是可选的,所以不能用不带参数的该属性来创建包含 Shapes 集合中所有图形的 ShapeRange 对象。
如果可在用户界面上对若干选定的图形同时执行某一操作,那么通过构造 ShapeRange 集合,并对该集合应用适当的属性和方法,可在编程中实现相同的操作。下例在 myDocument
上构造了包含图形“Big Star”和“Little Star”的图形区域,并对这些图形应用过渡填充格式。
Set myDocument = Worksheets(1)
Set myRange = myDocument.Shapes.Range(Array("Big Star", _
"Little Star"))
myRange.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientBrass
以下是如何应用属性和方法(当它们应用于 ShapeRange 集合时)的一般准则。
当设置那些组合于 ShapeRange 集合第二级对象(如 FillFormat 对象)下的图形属性时,上述准则同样适用。如果第二级对象所代表的操作能在用户界面中的多个选定对象上同时执行,那么就能从 ShapeRange 集合中返回该对象并设置其属性。例如,可用 Fill 属性返回代表 ShapeRange 集合中所有图形的填充格式的 FillFormat 对象。如果设置此 FillFormat 对象的属性,则将设置 ShapeRange 集合中所有单个图形的同一属性。
即使不能在用户界面上通过选定若干图形并执行某一命令来对这些图形同时进行某一操作,也可以通过下述编程的方式来执行该操作:在包含要处理的图形的 Shapes 集合或 ShapeRange 集合中循环,对集合中的单个 Shape 对象应用适当的属性和方法。下例在 MyDocument
上的所有图形中循环,并更改每个自选图形的前景色。
Set myDocument = Worksheets(1)
For Each sh In myDocument.Shapes
If sh.Type = msoAutoShape Then
sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
End If
Next
下例构造了包含活动窗口中所有当前选定的图形的 ShapeRange 集合,并设置每个选定图形的前景色。
For Each sh in ActiveWindow.Selection.ShapeRange
sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
Next
使用 Align 方法和 Distribute 方法可按图形间的相对位置或按与文档的相对位置来定位一组图形。使用 Group 方法或 Regroup 方法可将一组图形构造为单个组合图形。