Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9333|回复: 15

[VBA] 001-如何获得所有控件的属性及属性值-疑难千寻千解丛书(VBA)

[复制链接]
发表于 2011-1-4 15:59 | 显示全部楼层 |阅读模式
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
选择菜单“插入”→“模块”,并在新模块中输入以下代码:
  1. Sub 获取窗体中控件的属性列表()
  2. On Error Resume Next '遇到错误时继续执行
  3. Dim 控件 As Object, 数量 As Long, arr() As String
  4. For Each 控件 In UserForm1.Controls '遍历窗体中所有控件
  5.   Dim 信息 As InterfaceInfo, mem As MemberInfo '声明变量,用于获取控件属性
  6.   Set 信息 = InterfaceInfoFromObject(控件) '从控件获取属性
  7.   If Not (信息 Is Nothing) Then '如果有可以提取的信息
  8.     For Each mem In 信息.Members '遍历信息的子项目     'InvokeKind表示对象属性,其成员有INVOKE_FUNC、INVOKE_PROPERTYGET、
  9.     'INVOKE_PROPERTYPUT、INVOKE_PROPERTYPUTREF
  10.       If mem.InvokeKind And INVOKE_PROPERTYGET Then
  11.         数量=数量 + 1 '累加变量,它表示找到的信息个数
  12.         '重新声明数组的维数,当找到的信息增加时,数组的维数也相应增加
  13.         ReDim Preserve arr(1 To 3, 1 To 数量)
  14.         arr(1, 数量) = 控件.Name '对数组的第一行,最后一列赋值为控件名称
  15.         arr(2, 数量) = mem.Name '对数组的第二行,最后一列赋值为属性名称
  16.                                            '对数组的第三行,最后一列赋值为属性值
  17.         arr(3, 数量) = CallByName(控件, mem.Name, VbGet)
  18.       End If
  19.     Next
  20.   End If
  21. Next
  22. If 数量> 0 Then '如果找到有目标值   = Array("控件", "属性", "值") '写入标题
  23.   .Resize(数量, 3) = WorksheetFunction.Transpose(arr) '将数组的值导入工作表
  24.   Columns("a:c").AutoFit 'A:C列自动适应列宽  Columns("a:c").HorizontalAlignment = xlLeft '左对齐
  25. End If
  26. End Sub

复制代码
步骤4
光标定位于代码中任意位置,按【F5】键执行过程“获取窗体中控件的属性列表”,在工作表中将会罗列出名为“UserForm1”的窗体中所有控件的属性,包括名称及其属性值,如下图所示。
如果在工作表中插入OLE控件——图像控件和选项按钮,获取它们的属性及属性值可以采用与上面相同的思路,仅仅对其中一句代码稍加修改即可,即第四句修改为:
For Each 控件 In Sheets(1).OLEObjects '遍历工作表中所有OLE对象


=============================
上摘自《EXCEL2010编程与实践》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +2 收起 理由
老糊涂 + 2 好资料

查看全部评分

 楼主| 发表于 2011-1-4 15:59 | 显示全部楼层
而对于窗体的属性及属性值,可以使用以下代码实现:

  1. '2007和2010用户需要进入“信任中心”→“宏设置”,勾选“信任对VBA工程对象模型的访问”
  2. '2003用户进入“工具”→“宏”→“安全性”→“可靠发行商”,勾选“信任对“Visual Basic
  3. '项目”的访问”
  4. Sub 获取窗体的属性列表()  '代码通用于Excel 2003、2007和2010
  5. On Error Resume Next
  6. Dim i As Long, j As Long, 数量 As Long, arr() As String
  7. With ThisWorkbook.VBProject.VBComponents
  8.   For i = 1 To .Count     '遍历工程中所有部件
  9.     If .Item(i).Type = 3 Then  '如果其类型是窗体(值为1表示模块,2表示类模块)
  10.         '遍历窗体的所有属性
  11.       For j = 1 To ThisWorkbook.VBProject.VBComponents(i).Properties.Count
  12.         数量=数量 + 1  '累加计数器,该变量代表窗体属性的个数
  13.         ReDim Preserve arr(1 To 3, 1 To 数量)  '重新声明数组的维数
  14.         With ThisWorkbook.VBProject.VBComponents(i)
  15.           arr(1, 数量) = .Name  '对数组第一行赋值为窗体名
  16.           arr(2, 数量) = .Properties(j).Name  '对数组第一行赋值为属性名
  17.           arr(3, 数量) = .Properties(j)    '对数组第一行赋值为属性值
  18.         End With
  19.       Next j
  20.     End If
  21.   Next
  22. End With
  23. If 数量> 0 Then  '如果找到目标值
  24.   [a1:c1] = Array("控件", "属性", "值")    '写入标题
  25.   [a2].Resize(数量, 3) = WorksheetFunction.Transpose(arr)  
  26.   '将数组的值导入工作表
  27.   Columns("a:c").AutoFit  'AC列自动适应列宽
  28.   Columns("a:c").HorizontalAlignment = xlLeft  '左对齐
  29. End If
  30. End Sub
复制代码

=============================

以上摘自《EXCEL2010编程与实践》
回复

使用道具 举报

 楼主| 发表于 2011-1-4 16:00 | 显示全部楼层
如果代码看得头晕,那就爬进VBE,然后按F8(先同情下F8……)
回复

使用道具 举报

发表于 2011-1-4 16:41 | 显示全部楼层
小妖 发表于 2011-1-4 16:00
如果代码看得头晕,那就爬进VBE,然后按F8(先同情下F8……)

我已经晕了{:1812:}
回复

使用道具 举报

发表于 2011-1-4 16:45 | 显示全部楼层
资料很好,谢谢分享
回复

使用道具 举报

发表于 2011-1-4 17:27 | 显示全部楼层
....................
回复

使用道具 举报

发表于 2011-1-5 08:54 | 显示全部楼层
谢谢版版分享
回复

使用道具 举报

发表于 2011-1-11 16:39 | 显示全部楼层
{:35:}{:35:}
回复

使用道具 举报

发表于 2011-4-9 21:39 | 显示全部楼层
{:011:}{:011:}{:011:}{:011:}
回复

使用道具 举报

发表于 2011-10-24 18:30 | 显示全部楼层
看了下,我VBA确实很次,在学习中。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-7 12:20 , Processed in 0.422937 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表