三、使用图形对象 1.使用名称 对图形对象的引用通常有两种方式: 方式一:工作表名称.Shapes(“图形对象名称”) 方式二:工作表名称.[图形对象名称] 在插入图形对象时,默认的名称通常为“图片 1”、“列表框 3”、“直线 6”之类的格式,使用起来很不方便,我们可以把它修改成自己的名称。步骤: (1)选定图形对象 (2)在名称框中输入新名称,回车 (图2)
如果使用代码插入图形对象,可以在插入时命名,如: Sheet1.DropDowns.Add( 220.5, 147, 72, 22).Name=”DRP1” 注:在系统内部还有一个看不见的名称,格式如“Line 1”(英文对象类别后加空格及数字序号),这个名称可以按照上面的方式引用,但不随Name设置的改变而改变。类似有趣的现象后面还会出现,本文不去探讨EXCEL的内部机制,有兴趣的朋友可以自己去做各种美妙的遐想。 虽然都指向同一个对象,这两种引用方式是有差别的,来看一段录制宏的代码: Sub Macro1() ' ' Macro1 Macro ' 宏由 .... 录制,时间: .... ' ' ActiveSheet.Shapes("LBX1").Select With Selection .Placement = xlMove .PrintObject = False End With End Sub 上面的代码可以正确运行。 “录制宏,但要简化它”,是使用VBA的基本技巧,但简化成下面的代码是不能运行的,系统会提示“运行时错误(438) 对象不支持属性或方法”: Sub Macro1() With ActiveSheet.Shapes("LBX1") .Placement = xlMove .PrintObject = False End With End Sub 如果将上面改为方式一的引用,用ActiveSheet.[LBX1]来代替ActiveSheet.Shapes("LBX1"),则可以正确运行。 正是基于这种差别,笔者建议在对图形对象的使用中使用第二种方式。 2.自动列出成员信息 使用名称解决了图形对象的运行障碍,但遗憾的是,却不能象使用标准控件时,当我们在VBE中输入对象的名称,再输入一个“点”后,VBE会自动列出它的成员方便地供我们选择。 (图3)
事实上,图形对象一样可以做到。 让我们先来做一项预设置。打开对象留览器,在对象留览器中按鼠标右键,勾选“显示隐含成员”,然后关闭对象留览器。 (图4)
做好了上面设置,只需要根据为不同的图形对象引入一个明确类型的对变量,并将这个对象变量指向具体图形对象就可以了。下面是使用列表框的示意代码: Dim lst As ListBox Set lst = Sheet1.[LST1] 以后只要输入lst.后,就会自动列出列表框[LST1]的成员了。 (图5)
注意:在不同的Office环境下,有些成员的使用受限制或不能使用。 图形对象的类名借助TypeName函数可以得到,下面给出常用的图形对象的类名。 Label 标签 GroupBoxe 分组框 Button 按钮 CheckBoxe 复选框 OptionButton 选项按钮 ListBoxe 列表框 DropDown 组合框 ScrollBar 滚动条 Spinner 微调项 Line 直线 Line 箭头 Rectangle 矩形 Oval 椭圆 TextBox 文本框 Rectangle 艺术字 Picture 图片,剪贴画 自选图形根据实际选定的图形确定 3.常用成员 虽然每个图形对象都有自己不同的成员,但有些成员在各图形对象中都会用到,象位置信息,有些在多个成员中用到,象Text属性。 Name 名称 OnAction 指定宏名 Visible Boollean型,是否可见 Left,Top 左上角位置 Width 宽度 Height 高度 TopLeftCell 左上角所在单元格 .BottomRightCell 右下角所在单元格 Locked 是否锁定 PrintObject 是否为打印对象 LinkedCell 控制单元格 Placement 位置方式,1-3,与设置自选图形格式“属性”选项卡对应 Text 文本内容 Value 值,列表框和组合框值为所选项在全部项中的索引号 4.组合图形对象 为了管理和分组的需要,有时需要对一些图形对象进行组合使用。可以使用ShapeRange对象的Group方法完成。这里需要说明的是,组合后会对部分成员的调用产生影响,因此,在对组合成员进行代码操作时,一般可以先拆散集合,设置完成后在重新组合。 下面代码完成向工作表添加一个分组框和两个选项按钮,先将它们组合,然后拆散组合设置个图形对象后再重新组合。如果屏蔽Ungroup句,代码运行将出错。 Sub aSmpOptGroup() With Sheet1 .GroupBoxes.Add(100, 100, 120, 30).Name = "FRAM1" .OptionButtons.Add(105, 105, 50, 20).Name = "OPT1" .OptionButtons.Add(160, 105, 50, 20).Name = "OPT2" .Shapes.Range(Array("FRAM1", "Opt1", "Opt2")).Group.Name = "GRP1" [GRP1].Ungroup '拆散组合 .[FRAM1].Caption = "Hello" .[OPT1].Caption = "H1" .[OPT1].OnAction = "Macro6" .[OPT2].Caption = "H2" .[OPT2].OnAction = "Macro7" .Shapes.Range("FRAM1").Regroup.Name = "GRP1" End With End Sub
|