ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 一个有意思的字典,树形字典 TreeDic!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2021-4-25 08:27 | 显示全部楼层
山中老人 发表于 2021-4-25 08:24
您如果有需要应用到树形结构的地方,您可以提一个需求,我写对应的代码来实现!

谢谢大侠,我找一个!!!

TA的精华主题

TA的得分主题

发表于 2021-4-25 10:02 | 显示全部楼层
大侠您看这个例子您能教小弟怎么做吗?我看这种就挺难的了!!!

树形分类统计.rar

19.94 KB, 下载次数: 43

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 10:13 | 显示全部楼层
本帖最后由 山中老人 于 2021-4-26 09:47 编辑

教程2 Branch 进一步了解

接前面,

第一步:其实我们可以直接完成教程1的三步工作
     Dim TD As New TreeDic
     Dim Brc As TreeDic : Set Brc = TD("中国") ("四川")

    在这里,我们就很容易看懂2楼的代码Set whq = TD("中国")("四川")("成都")("武侯区")表达的意思了吧!



后面内容已经修改,请参见  【教程5 文本导入导出

代码已经修改,请使用新版 树形分类统计2.rar







TreeDic.rar

3.78 KB, 下载次数: 140

新的

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-4-25 13:07 | 显示全部楼层
学习数据结构的好贴,谢谢大神分享!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 13:37 | 显示全部楼层
本帖最后由 山中老人 于 2021-4-25 14:13 编辑
xiaofan1999 发表于 2021-4-25 10:02
大侠您看这个例子您能教小弟怎么做吗?我看这种就挺难的了!!!
副本Xl0000092.rar (77.04 KB, 下载次数: 62)
捕获.JPG

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 14:47 | 显示全部楼层
喔!
差点搞完了,加入[上级]Parent属性后, 使用完了记得用Class_Terminate释放内存,避免上下级相互锁定一直占用内存。

TD.Class_Terminate '结束,释放内存


副本Xl0000092.rar (77.88 KB, 下载次数: 60)

捕获.JPG

TA的精华主题

TA的得分主题

发表于 2021-4-25 14:58 | 显示全部楼层
本帖最后由 xiaofan1999 于 2021-4-25 15:07 编辑
山中老人 发表于 2021-4-25 10:13
教程2 Branch 进一步了解

接前面,

大侠您真是太牛了,小弟万分敬仰!!!

TA的精华主题

TA的得分主题

发表于 2021-4-25 15:09 | 显示全部楼层

这是我目前看到的最复杂的代码,能够认识您小弟真是幸运!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 16:05 | 显示全部楼层
本帖最后由 山中老人 于 2021-4-27 07:11 编辑

教程3 Object Value

接前面,我们的树结构搭建好了,现在可以在上面挂东西了(存取数据)!

第一步:通过 Object 我们可以给任何Branch挂上一些果子(对象)。
    Dim TD As New TreeDic
    Dim whq As TreeDic: Set whq = TD.PathBranch("/中国/四川/成都/武侯区", , True) '依据字符串,创建结构
    Dim RS As New ADODB.Recordset
    Set whq.Object("数据集") = RS
    Set RS = whq.Object("数据集")


TreeDic.Object 声明:可读写
Public Property Get Object (Key As Variant) As Object '对象
Public Property Set Object (Key As Variant, RHS As Object) '对象


TreeDicObject 相关的属性和方法:
Public Function ObjectExist(Key As Variant) As Boolean '确定对象是否存在
Public Property Get ObjectCount() As Long '对象计数
Public Property Get Objects() As TreeDic() '获得对象的数组
Public Function ObjectRemove(Key As Variant) As Boolean '移除一个对象
Public Sub ObjectRemoveAll() '移除全部对象

第二步:通过 Value我们可以给任何Branch挂上一些树叶(值)。

     Dim TD As New TreeDic
     Dim Brc As TreeDic : Set Brc = TD("中国")("四川")("成都")("武侯区")
     Brc.Value("面积") = 76.99
     Debug.Print Brc .ValueStr("面积")
输出:
     /中国/四川/成都/武侯区.面积=76.99

TreeDic.Value声明:可读写
Public Property Get Value(Key As Variant) As Object '值
Public Property Let Value(Key As Variant, RHS As Object) '


TreeDicValue相关的属性和方法:
Public Function ValueExist(Key As Variant) As Boolean '确定是否存在
Public Property Get ValueCount() As Long '计数
Public Property Get Values() As TreeDic() '获得的数组
Public Function ValueRemove(Key As Variant) As Boolean '移除一个
Public Sub ValueRemoveAll() '移除全部
Public Function ValueStr(ByVal Key As Variant) As String '值的(带路径)表达式 见:教程5 文本导入导出

副本Xl0000092.rar (75.76 KB, 下载次数: 56)



评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 16:40 | 显示全部楼层
本帖最后由 山中老人 于 2021-4-26 09:43 编辑

教程4 其他方法与属性
接前面,

第一步:通过 Parent 获得Branch的上一级。
TreeDic.Parent 声明:只读
Public Property Get Parent() As TreeDic '上级


第二步:通过 Name 读写Branch的名称。Branch.Name 与 Branch的访问Key一致。

TreeDic.Name 声明:可读写
Public Property Get Name(Key As Variant) As Variant
Public Property Let Name(Key As Variant, RHS As Variant)


演示一下:
    Dim TD As New TreeDic    Dim whq As TreeDic: Set whq = TD.PathBranch("/中国/四川/成都/武侯区", , True)
    whq.Name = "锦江区"
    Debug.Print "Path=" & whq.Path & ",   Name=" & whq.Name
输出:
     Path=/中国/四川/成都/锦江区,   Name=锦江区

注意:在TreeDic中禁止使用对象作为Key或Name


第三步: ItemType
Public Function ItemType(Key As Variant) As ItemTypeEnum '主键分类
确定一个Key是否存在及Item类型,返回结果参考 枚举 ItemTypeEnum:
Public Enum ItemTypeEnum
    NoItem = 0 '没有
    IsBranch = 1  '树枝 Branch
    IsObject = 2  '果实(对象)Object
    IsValue = 3   '树叶(值)Variant
End Enum


第四步: Level
Public Property Get Level () As Long 'Branch的等级


第五步: 全域访问,遍历所有的 Branch
Public Function AllBranchS() As TreeDic() '以数组方式,输出树桩所有Branch对象



评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-16 20:56 , Processed in 0.043223 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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