ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 22610|回复: 6

[求助] Vba遍历控件,获取控件属性值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-6-3 13:05 | 显示全部楼层 |阅读模式
Excel中,视图——工具栏——控件工具箱,选择“命令按钮”,或其他控件的——Shackwave Flash Object,在excel中能画出控件。
点击右键——属性,能看到这些控件的属性值。
假如这些控件种类、数量有很多,有命令按钮、复选框按钮、选项按钮、单选、ShockwaveFlash控件,可能还有不知道名字的。
我的要求,使用程序,如何遍历控件,遍历控件,遍历控件,获得这些控件的属性值?
请各位大侠帮忙,帮我做下,谢谢。
部分属性见附件:

获取控件属性值.rar

10.34 KB, 下载次数: 298

TA的精华主题

TA的得分主题

发表于 2014-6-3 13:45 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-3 14:14 | 显示全部楼层
mineshine 发表于 2014-6-3 13:45
如何枚舉控件屬性???
http://club.excelhome.net/thread-197713-1-1.html

大侠,你好,我仔细看了,这个是窗体的,Sheet1工作表的没有。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-3 23:40 | 显示全部楼层
得到部分属性
  1. Sub a()
  2. For Each sht In ActiveWorkbook.Sheets
  3.     For Each obj In sht.OLEObjects
  4.         If obj.Name Like "ShockwaveFlash*" Then
  5.            Cells(i + 1, 1) = obj.Object.Movie
  6.            i = i + 1
  7.         End If
  8.     Next
  9. Next sht
  10. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-3 23:42 | 显示全部楼层
窗体的,学习别人的
  1. Sub EnumUserForms5()
  2.     On Error Resume Next
  3.     Dim i As Long, j As Long, n As Long
  4.     Cells(1, 1) = "控件"
  5.     Cells(1, 2) = "属性,方法,事件"
  6.     Cells(1, 3) = "值"
  7.         With ThisWorkbook.VBProject.VBComponents
  8.         For i = 1 To .Count
  9.             If .Item(i).Type = 3 Then
  10.                 For j = 1 To ThisWorkbook.VBProject.VBComponents(i).Properties.Count
  11.                 n = n + 1
  12.                     Cells(n + 1, 1) = ThisWorkbook.VBProject.VBComponents(i).Name
  13.                     Cells(n + 1, 2) = ThisWorkbook.VBProject.VBComponents(i).Properties(j).Name
  14.                     Cells(n + 1, 3) = ThisWorkbook.VBProject.VBComponents(i).Properties(j)
  15.                 Next j
  16.             End If
  17.         Next
  18.     End With
  19. End Sub

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-4 22:20 | 显示全部楼层
  1. '引用TypeLib Information
  2. Sub listcontrols()
  3.     Cells(1, 1) = "控件"
  4.     Cells(1, 2) = "属性,方法,事件"
  5.     Cells(1, 3) = "值"
  6.     [a1:c1].Interior.ColorIndex = 3
  7.     On Error Resume Next
  8.     Dim ctl As Object, n As Long
  9.         n = 1
  10.         For Each ctl In Sheet1.OLEObjects
  11.         Dim iInf As InterfaceInfo
  12.         Set iInf = InterfaceInfoFromObject(ctl)
  13.         If Not (iInf Is Nothing) Then
  14.         Dim mem As MemberInfo
  15.         For Each mem In iInf.Members
  16.         If mem.InvokeKind And INVOKE_PROPERTYGET Then
  17.             n = n + 1
  18.             Cells(n, 1) = ctl.Name
  19.             Cells(n, 2) = mem.Name
  20.             Cells(n, 3) = CallByName(ctl, mem.Name, VbGet)
  21.         End If
  22.         Next
  23.         End If
  24.         Next
  25.     [a1:c65536].Columns.AutoFit
  26. End Sub
复制代码
又学到一种方法。

TA的精华主题

TA的得分主题

发表于 2017-8-31 14:22 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-23 17:45 , Processed in 0.044406 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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