ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

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

更新3  差点忘了,一些结构的操作方法!


1、Public Function Copy(SourceBranch As TreeDic, Optional ByVal Key As Variant = Nothing) As Boolean'复制一个分支或根
    'SourceBranch=被复制的根或分支对象
    'Key=复制后,在新树上的主键(名称)

演示一下:
     
Dim TD As New TreeDic     Dim sc As TreeDic: Set sc = TD("中国")("四川")
     Dim Brc As TreeDic
     Set Brc = sc("成都")("武侯区")
     Set Brc = sc("巴中")("江北区")
     Dim bz As TreeDic: Set bz = sc("巴中")
     TD.Name = "地球"
     Dim hj As TreeDic: Set hj = TD("中国")("胡建")
     Debug.Print TD.AllBranchPath
     Debug.Print "1========================"
     Call hj.Copy(bz)
     Debug.Print TD.AllBranchPath

输出:
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/四川/巴中
地球/中国/四川/巴中/江北区
地球/中国/胡建
1========================
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/四川/巴中
地球/中国/四川/巴中/江北区
地球/中国/胡建
地球/中国/胡建/巴中
地球/中国/胡建/巴中/江北区


2、Public Function Move(SourceBranch As TreeDic, Optional ByVal Key As Variant = Nothing) As Boolean'移动一个分支或根,可以跨树移动
演示一下:
     
Dim TD As New TreeDic     Dim sc As TreeDic: Set sc = TD("中国")("四川")
     Dim Brc As TreeDic
     Set Brc = sc("成都")("武侯区")
     Set Brc = sc("巴中")("江北区")
     Dim bz As TreeDic: Set bz = sc("巴中")
     TD.Name = "地球"
     Dim hj As TreeDic: Set hj = TD("中国")("胡建")
     Debug.Print TD.AllBranchPath
     Debug.Print "1========================"
     Call hj.Move(bz) '
     Debug.Print TD.AllBranchPath

输出:
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/四川/巴中
地球/中国/四川/巴中/江北区
地球/中国/胡建
1========================
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/胡建
地球/中国/胡建/巴中
地球/中国/胡建/巴中/江北区

3、Public Sub Cut() '将分支从树上切下(变成独立的树)

4、Public Function Graft(DestinationBranch As TreeDic, Optional ByVal Key As Variant = Nothing) As Boolean'嫁接(将独立的树,插入到另一颗树上)
    'DestinationBranch=嫁接目的位置(分支或根)
    'Key=嫁接后,在新树上的主键(名称)

演示一下:
     
Dim TD As New TreeDic
     Dim sc As TreeDic: Set sc = TD("中国")("四川")
     Dim Brc As TreeDic
     Set Brc = sc("成都")("武侯区")
     Set Brc = sc("巴中")("江北区")
     Dim bz As TreeDic: Set bz = sc("巴中")
     TD.Name = "地球"
     Dim hj As TreeDic: Set hj = TD("中国")("胡建")
     Debug.Print TD.AllBranchPath
     Debug.Print "-----"
     Debug.Print bz.AllBranchPath
     Debug.Print "1========================"
     Call bz.Cut
     Debug.Print TD.AllBranchPath
     Debug.Print "-----"
     Debug.Print bz.AllBranchPath
     Debug.Print "2========================"
     Call bz.Graft(hj)
     Debug.Print TD.AllBranchPath
     Debug.Print "-----"
     Debug.Print bz.AllBranchPath


输出:
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/四川/巴中
地球/中国/四川/巴中/江北区
地球/中国/胡建
-----
地球/中国/四川/巴中/江北区
1========================
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/胡建
-----
巴中/江北区
2========================
地球/中国
地球/中国/四川
地球/中国/四川/成都
地球/中国/四川/成都/武侯区
地球/中国/胡建
地球/中国/胡建/巴中
地球/中国/胡建/巴中/江北区
-----
地球/中国/胡建/巴中/江北区

5、Public Function Clone() As TreeDic '创建[根]/[分支]的独立副本。在[根]上执行将复制整个树;在[分支]上执行,复制的[分支]将独立成一颗树。

演示一下:'克隆 根    Dim TD As New TreeDic
    TD.Value("总人口") = 335
    Dim whq As TreeDic:
    Set whq = TD("中国")("四川")("成都")("武侯区")
    whq.Value("面积") = 76.56
    whq.Value("面积单位") = "平方公里"
    TD("中国")("四川").Value("人口") = 123456789
    Dim BZS As TreeDic: Set BZS = TD("中国")("四川")("巴中")
    BZS.Value("电话区号") = "0827"
    BZS("江北区").Value("邮政编码") = 636099
    Debug.Print TD.AllBranchValueTxt(False)
    Debug.Print "1================"
    Dim TD2 As TreeDic: Set TD2 = TD.Clone
    TD.Clear
    Debug.Print TD2.AllBranchValueTxt(False)

输出:
.总人口=335
/中国
/中国/四川
/中国/四川.人口=123456789
/中国/四川/成都
/中国/四川/成都/武侯区
/中国/四川/成都/武侯区.面积=76.56
/中国/四川/成都/武侯区.面积单位=平方公里
/中国/四川/巴中
/中国/四川/巴中.电话区号=0827
/中国/四川/巴中/江北区
/中国/四川/巴中/江北区.邮政编码=636099
1================
.总人口=335
/中国
/中国/四川
/中国/四川.人口=123456789
/中国/四川/成都
/中国/四川/成都/武侯区
/中国/四川/成都/武侯区.面积=76.56
/中国/四川/成都/武侯区.面积单位=平方公里
/中国/四川/巴中
/中国/四川/巴中.电话区号=0827
/中国/四川/巴中/江北区
/中国/四川/巴中/江北区.邮政编码=636099

演示一下:'克隆 分支        Dim TD As New TreeDic
    Dim BZS As TreeDic: Set BZS = TD("中国")("四川")("巴中")
    Debug.Print TD.AllBranchValueTxt(False)
    Debug.Print "1================"
    Dim BZS2 As TreeDic: Set BZS2 = BZS.Clone
    Debug.Print BZS.AllBranchValueTxt(False)
    Debug.Print "----"
    Debug.Print BZS2.AllBranchValueTxt(False)



评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

更新附件! 树形分类统计4.rar (98.09 KB, 下载次数: 47)
树形分类统计5.rar (103.84 KB, 下载次数: 58)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-3 10:45 | 显示全部楼层

居然还可以这么做,小弟受教了!!!

TA的精华主题

TA的得分主题

发表于 2021-5-3 10:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
山中老人 发表于 2021-5-3 09:09
更新2 差点忘了,一些结构的操作方法!

太强大了!!!这种效果真好,一目了然!!!

TA的精华主题

TA的得分主题

发表于 2021-5-3 11:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
大神你是巴中的?如有机会希望能向你当面请教

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-3 13:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
likaiyihou 发表于 2021-5-3 11:42
大神你是巴中的?如有机会希望能向你当面请教

不是! 我丈母娘家在!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-6 06:17 | 显示全部楼层
本帖最后由 山中老人 于 2021-5-6 07:25 编辑

更新4 发现一个Bug
在复杂使用环境中,VBA会莫名的自动调用  Class_Terminate 执行,导致部分数据丢失!

所以只好,用Delete 来替代它!

Public Sub Delete() '删除  将本身从树上删除


另外:
修改ValueDic DataDic ,使用范围更广!


Public Property Get DataDic(Object As Boolean, Value As Boolean) As Scripting.Dictionary  '导出节点(根/分支)数据到字典
    'Object=True 导出包含对象
    'Value=True 导出包含值



树形分类统计6.rar (94.02 KB, 下载次数: 96)





评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-6 09:07 | 显示全部楼层
山中老人 发表于 2021-5-6 06:17
更新4 发现一个Bug
在复杂使用环境中,VBA会莫名的自动调用  Class_Terminate 执行,导致部分数据丢失!
...

感谢大佬这么细致的指点!!!

TA的精华主题

TA的得分主题

发表于 2022-4-24 17:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-4-24 23:39 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 20:29 , Processed in 0.046234 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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