ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2021-4-24 10:57 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 山中老人 于 2021-4-26 10:13 编辑

最近需要处理一些树形结构的数据,在VBA中一直没有太好的办法。用自定义数据类型,没法转换成Variant数据类型传递,而且很不好进行扩展。
使用字典、数组用起来也很麻烦。

最后我用字典,衍生出来一个【树形字典TreeDic】,专门处理这种树形数据结构。

特点:
      1、来自字典,具备无限的扩展性。
      2、将Dictionary.Item,划分成3类:树枝 Branch(TreeDic)、果实Object(对象)、树叶Value(值),分别存放3种数据,数量无限制。
      3、通过树枝 Branch进行结构扩展,果实Object 和 树叶Value来存放该节点的数据。

在处理:行政区划,组织架构,文件系统,以及多级筛选的数据,非常好用!

实例及最新附件 在28、29楼  教程5 文本导入导出

补充内容 (2021-4-29 08:15):
最新的更新,翻最后的回复吧!

包括用TreeDic存储多维数据表的想法!

补充内容 (2021-5-1 08:49):
大家,对它有什么,新的要求,可以留言。我尽量满足!

补充内容 (2024-12-22 14:21):
64楼 ,更新 添加 JSON 数据 输入输出支持!

评分

7

查看全部评分

TA的精华主题

TA的得分主题

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

演示代码:
Sub cs11()
    Dim TD As New TreeDic
    TD.Value("总人口") = 335
    '--
    Dim whq As TreeDic:
    Set whq = TD("中国")("四川")("成都")("武侯区") 'Set whq = TD.Branch("中国").Branch("四川").Branch("成都").Branch("武侯区")
    whq.Value("面积") = 76.56 '平方公里
    whq.Value("面积单位") = "平方公里"
    Debug.Print whq.Value("面积") & TD("中国")("四川")("成都")("武侯区").Value("面积单位")
    '--
    Dim BZS As TreeDic: Set BZS = TD("中国")("四川")("巴中")
    BZS.Value("电话区号") = "0827"
    Debug.Print BZS.Value("电话区号")
   
    '--
    Dim JB As TreeDic: Set JB = BZS("江北区")
    JB.Value("邮政编码") = 636099
    Debug.Print TD("中国")("四川")("巴中")("江北区").Value("邮政编码")
    '--
    TD("中国")("四川").Value("人口") = 123456789
    Debug.Print TD("中国")("四川").Value("人口")
End Sub




捕获2.JPG

TA的精华主题

TA的得分主题

发表于 2021-4-24 11:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这是怎么回事,
079.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-24 11:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 山中老人 于 2021-4-24 11:19 编辑

捕获.JPG

可以运行通过啊?

捕获2.JPG

TA的精华主题

TA的得分主题

发表于 2021-4-24 13:32 | 显示全部楼层
有大神創作有用的好東西一定支持
先留名,看以後有否機會用它

TA的精华主题

TA的得分主题

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

教程1 Branch
首先我们要明确处理的数据,是一种多层结构,一层层的衍生出来。可以想象成树形。最常用的就是:文件系统结构,行政区划,单位的组织架构。
以【文件系统结构】为例,文件夹、它里面的子文件夹、它的子文件夹的子文件夹......  构成了 整个文件系统的骨架,而各个文件夹中的文件只是附属罢了。

第一步:我们创建一个树桩【TD】:
    Dim TD As New TreeDic

第二步:在树桩【TD】上长出一根树枝叫【中国】。
    Dim Brc As TreeDic
    Set Brc = TD.Branch("中国")
    由于TreeDic的Branch属性是默认的,所以也可以省略掉Branch
    Set Brc = TD("中国")


第三步:树枝【中国】上长出一根分支叫【四川】
    Set Brc = Brc.Branch("四川")
    也可以写成:
    Set Brc = TD.Branch("中国") .Branch("四川")
    或者:
    Set Brc = TD("中国") ("四川")


TreeDic.Branch声明:
Public Property Get Branch(Key As Variant) As TreeDic '【默认属性】 分支
说明: 获取一个已有的树枝Branch,如果没有就创建它。 只读。


TreeDicBranch相关的属性和方法:
Public Function BranchExist(Key As Variant) As Boolean '确定分支是否存在
Public Property Get BranchCount() As Long '分支计数
Public Property Get Branchs() As TreeDic() '获得分支的数组
Public Function BranchRemove(Key As Variant) As Boolean '移除一个分支
Public Sub BranchRemoveAll() '移除全部分支

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-4-25 07:50 | 显示全部楼层
山中老人 发表于 2021-4-25 06:40
教程1 Branch:
首先我们要明确处理的数据,是一种多层结构,一层层的衍生出来。可以想象成树形。最常用的 ...

大侠您整个具体的实例试试呀?小弟弄了半天也没明白!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 08:12 | 显示全部楼层
xiaofan1999 发表于 2021-4-25 07:50
大侠您整个具体的实例试试呀?小弟弄了半天也没明白!

我嫌写实例太烦了,我现在写的程序又不好截取出来!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-4-25 08:24 | 显示全部楼层
xiaofan1999 发表于 2021-4-25 07:50
大侠您整个具体的实例试试呀?小弟弄了半天也没明白!

您如果有需要应用到树形结构的地方,您可以提一个需求,我写对应的代码来实现!

TA的精华主题

TA的得分主题

发表于 2021-4-25 08:25 | 显示全部楼层
本帖最后由 xiaofan1999 于 2021-4-25 08:28 编辑
xiaofan1999 发表于 2021-4-25 07:50
大侠您整个具体的实例试试呀?小弟弄了半天也没明白!

谢谢大侠,我找一个有特点的例子再来麻烦您!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 17:09 , Processed in 0.040163 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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