ET疑难千寻千解丛书之EXCEL2010编程与实践 罗刚君 章兰新 黄朝阳 编著
疑难1
如何获取所有控件的属性及属性值 VBA编程一定会涉及诸多控件,在初学VBA时有必要了解控件包括哪些属性。那么如何利用VBA代码一次性罗列这些控件或者窗体的属性及属性值呢? è 解决方案 ActiveX控件和VBE窗体中的控件可以借助TypeLib Information这个对象提供的InterfaceInfoFromObject方法来获取所有属性。而窗体的属性则通过VBComponents集合的Properties属性来获取。 在编写代码时有两种解决方案,包括前期绑定和后期绑定。 í 操作方法 获取窗体中控件的属性,需要引用TypeLib Information控件,具体步骤如下: 步骤1
按【Alt+F11】组合键打开VBE窗口。 步骤2
选择菜单“工具”→“引用”,打开“引用”对话框,单击“浏览”按钮进入System32目录,从中选择文件“TLBINF32.DLL”并双击,在“引用”对话框中将看到名为“TypeLib Information”的引用,如下图示,将其勾选后单击“确定”按钮,从而添加“TypeLib Information”的引用。 步骤3
选择菜单“插入”→“模块”,并在新模块中输入以下代码: - Sub 获取窗体中控件的属性列表()
- On Error Resume Next '遇到错误时继续执行
- Dim 控件 As Object, 数量 As Long, arr() As String
- For Each 控件 In UserForm1.Controls '遍历窗体中所有控件
- Dim 信息 As InterfaceInfo, mem As MemberInfo '声明变量,用于获取控件属性
- Set 信息 = InterfaceInfoFromObject(控件) '从控件获取属性
- If Not (信息 Is Nothing) Then '如果有可以提取的信息
- For Each mem In 信息.Members '遍历信息的子项目 'InvokeKind表示对象属性,其成员有INVOKE_FUNC、INVOKE_PROPERTYGET、
- 'INVOKE_PROPERTYPUT、INVOKE_PROPERTYPUTREF
- If mem.InvokeKind And INVOKE_PROPERTYGET Then
- 数量=数量 + 1 '累加变量,它表示找到的信息个数
- '重新声明数组的维数,当找到的信息增加时,数组的维数也相应增加
- ReDim Preserve arr(1 To 3, 1 To 数量)
- arr(1, 数量) = 控件.Name '对数组的第一行,最后一列赋值为控件名称
- arr(2, 数量) = mem.Name '对数组的第二行,最后一列赋值为属性名称
- '对数组的第三行,最后一列赋值为属性值
- arr(3, 数量) = CallByName(控件, mem.Name, VbGet)
- End If
- Next
- End If
- Next
- If 数量> 0 Then '如果找到有目标值 = Array("控件", "属性", "值") '写入标题
- .Resize(数量, 3) = WorksheetFunction.Transpose(arr) '将数组的值导入工作表
- Columns("a:c").AutoFit 'A:C列自动适应列宽 Columns("a:c").HorizontalAlignment = xlLeft '左对齐
- End If
- End Sub
复制代码步骤4
光标定位于代码中任意位置,按【F5】键执行过程“获取窗体中控件的属性列表”,在工作表中将会罗列出名为“UserForm1”的窗体中所有控件的属性,包括名称及其属性值,如下图所示。 如果在工作表中插入OLE控件——图像控件和选项按钮,获取它们的属性及属性值可以采用与上面相同的思路,仅仅对其中一句代码稍加修改即可,即第四句修改为: For Each 控件 In Sheets(1).OLEObjects '遍历工作表中所有OLE对象
============================= 以上摘自《EXCEL2010编程与实践》 |