ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 山中老人

[分享] 【类模块】的超级属性,无限扩展,值和对象 通用! 类的继承封装演示

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2022-4-19 22:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:类和类模块
山中老人 发表于 2020-7-6 20:28
可以无限向里面添加属性或者对象!
例如:

大牛,将努力向您学习!

TA的精华主题

TA的得分主题

发表于 2022-10-25 19:04 | 显示全部楼层
不知道大佬还在不在,我现在用类还不熟练,仅停留在初级阶段,用用几个属性就差不多了
我现在看你这帖子里这么多繁杂的代码还很难理解,但是单就 怎么给一个类添加一个字典属性 这件事情特别感兴趣,想知道通过哪几步可以实现这个事情?可以麻烦大佬提炼一下代码吗

TA的精华主题

TA的得分主题

发表于 2022-10-26 16:17 | 显示全部楼层
山中老人 发表于 2020-7-6 20:28
可以无限向里面添加属性或者对象!
例如:

感觉这跟直接用字典有什么区别?

TA的精华主题

TA的得分主题

发表于 2022-10-26 16:40 | 显示全部楼层
鬼不火 发表于 2022-10-25 19:04
不知道大佬还在不在,我现在用类还不熟练,仅停留在初级阶段,用用几个属性就差不多了
我现在看你这帖子里 ...
  1. '简化代码楼主代码,提取出封装字典代码
  2. 'Class 类代码内容,新建一个类模块取名DevelopDictionary,复制到类模块里

  3. Private Dic_ As Scripting.Dictionary '内部变量,用来存储字典

  4. '类被创建时自动调用
  5. Private Sub Class_Initialize() '类初始化
  6.     Set Dic_ = New Scripting.Dictionary
  7. End Sub

  8. '类被注销时自动调用
  9. Private Sub Class_Terminate()
  10.      Set Dic_ = Nothing
  11. End Sub

  12. '数量
  13. Public Property Get Count() As Long
  14.     Count = Dic_.Count
  15. End Property

  16. '检查key是否存在
  17. Public Function Exists(Key As Variant) As Boolean
  18.     Exists = Dic_.Exists(Key)
  19. End Function

  20. '读取Item时会调用,如:v = d.Item(key)
  21. Public Property Get Item(Key As Variant) As Variant
  22.     If IsObject(Dic_.Item(Key)) Then
  23.         Set Item = Dic_.Item(Key)
  24.     Else
  25.         Item = Dic_.Item(Key)
  26.     End If
  27. End Property

  28. 'Set赋值Item时调用,如:Set d.Item(key) = New Scripting.Dictionary
  29. Public Property Set Item(Key As Variant, RHS As Variant)
  30.     Set Dic_.Item(Key) = RHS
  31. End Property

  32. '赋值Item时会调用,如:d.Item(key) = 1
  33. Public Property Let Item(Key As Variant, RHS As Variant)
  34.     Dic_.Item(Key) = RHS
  35. End Property

  36. '移除一个key
  37. Public Function Remove(Key As Variant) As Boolean
  38.     Dic_.Remove Key
  39. End Function

复制代码
上面是类代码,下面是测试代码在模块中测试。
  1. Sub test()
  2.     Dim d As New DevelopDictionary
  3.     d.Item("key") = 123
  4.     Debug.Print d.Item("key")
  5.     Debug.Print d.Count
  6.     Debug.Print d.Exists("key")
  7.     d.Remove ("key")
  8. End Sub
复制代码
简化了大部分楼主的代码,作为你能看懂的Demo。
去掉了Implements接口,去掉了自定义事件,只保留了封装字典代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 08:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
鬼不火 发表于 2022-10-25 19:04
不知道大佬还在不在,我现在用类还不熟练,仅停留在初级阶段,用用几个属性就差不多了
我现在看你这帖子里 ...

需求,才是学习的动力。
你现在还没有相应的需求,所以不容易看懂!
等你有了相关需要,再来看看,就好懂了!............

你现在只需要知道,在VBA下 有一种办法:可以让【自编类】,获得【随意增加属性、事件】的能力。就好了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 08:34 | 显示全部楼层
905738810 发表于 2022-10-26 16:17
感觉这跟直接用字典有什么区别?

这个DevelopDictionary是作为【自编类】的一个万能插槽,方便【自编类】在后期(实例化后)追加各种属性。
与【自编类】加个字典,最大的区别:可以通过通用事件接口 toEventS,为追加属性提供事件触发和返回。
(通过  实例名_EventS(Source As DevelopDictionary, EventInfo As DevelopDictionary, ReturnVal As Variant) ,来识别处理事件。)



TA的精华主题

TA的得分主题

发表于 2022-12-29 11:20 | 显示全部楼层
好东西,对正在学习类模块的我很有帮助,谢谢山中老人。

TA的精华主题

TA的得分主题

发表于 2023-1-3 19:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-1-4 12:25 | 显示全部楼层
太深奥了,只有好好学习了

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 08:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我是在学JavaScript的时候触发的灵感,JavaScript 中任何变量、方法都可以随便加属性,非常自由....

就像这样:
Dim A As Long
A.姓名="张三"
A.身高=192
........
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 15:23 , Processed in 0.037861 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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