ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 类的继承、封装 演示。 Dictionary 词典增强,第二弹! 2维字典

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-14 16:58 | 显示全部楼层 |阅读模式
本帖最后由 山中老人 于 2020-7-17 12:36 编辑

在VBA 中 Scripting.Dictionary 词典 真是一个非常好用的东西,我的程序很多地方都使用到它。前面我已经搞了个DevelopDictionary,大家很热情。再搞个二维字典,大家试试!


词典一般每个Key下面只能存一个Item,虽然可以用数组做Item,但操作起来很麻烦!
所以,第二弹我把Scripting.Dictionary 改造成了可存储多个Item的二维词典:DevelopDictionary2
与DevelopDictionary相比,取消了事件处理代码,Item二维化改造。可设置列数(每个Key带的Item数),设置列名。

嗯! 大家可以将DevelopDictionary2,看做是一个放在内存中的表。

根据各位网友的意见,上传附件 实例,包括一些功能测试(演示)的过程!

2020-07-17 关于Dictionary字典排序的深入思考!


DevelopDictionary2.rar

40.76 KB, 下载次数: 48

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-14 16:59 | 显示全部楼层
本帖最后由 山中老人 于 2020-7-14 18:10 编辑

测试代码:


Sub cs单列模式()
    Dim dd As DevelopDictionary2, dd2 As New DevelopDictionary2, Str As String
    Set dd = New DevelopDictionary2
    dd("a") = "A"
    dd("b") = "B"
    dd(3) = "C"
    Debug.Print VBA.Join(dd.Keys, ",")
    Debug.Print VBA.Join(dd.Items, ",")
    Debug.Print dd.RowIndex("b") '行号(从0开始编号)
    Debug.Print dd.Index("a")  '行号(从0开始编号)
   
    Str = dd.StrJoin(Chr(13)) '全部数据 输出字符串
    Debug.Print Str
    Call dd2.StrSplit(Str, Chr(13)) '字符串输入
    Debug.Print
    Debug.Print "dd2"
    Debug.Print dd2.StrJoin(Chr(13))
End Sub


Sub cs读写列名()
    Dim dd As DevelopDictionary2, dic As Scripting.Dictionary
    Set dd = New DevelopDictionary2
    dd.ColumnCount = 3 '设置列数
'    Debug.Print dd.Dict.Count
    dd.ColumnName(0) = "ID"
    dd.ColumnName(1) = "姓名"
    dd.ColumnName(2) = "年龄"
    dd.ColumnName(1) = "年龄2"
    Debug.Print dd.ColumnName(0)
    Debug.Print dd.ColumnName(1)
    Debug.Print dd.ColumnName(2)
    Debug.Print dd.ColumnIndex("姓名") '列号
End Sub

Sub cs读写数据() '排序
    Dim dd As DevelopDictionary2, dic As Scripting.Dictionary
    Set dd = New DevelopDictionary2
    dd.ColumnCount = 4 '设置列数
    dd.ColumnName(0) = "ID"
    dd.ColumnName(1) = "姓名"
    dd.ColumnName(2) = "年龄"
    dd.ColumnName(3) = "学历"
   
    dd.Item(1, "ID") = 11
    dd.Item(1, "姓名") = "张三"
    dd.Item(1, "年龄") = 25
    dd.Item(1, "学历") = "初中"
'    Debug.Print dd.Item(1, "ID")
'    Debug.Print dd.Item(1, "姓名")
'    Debug.Print dd.Item(1, "年龄")
'    Debug.Print dd.Item(1, "学习记录")
   
    dd.Item(2, "ID") = 12
    dd.Item(2, 1) = "李四"
    dd.Item(2, "年龄") = 54
    dd.Item(2, 3) = "文盲"
   
    dd.Item(7, "ID") = 4
    dd.Item(7, 1) = "张飞"
    dd.Item(7, "年龄") = 15
    dd.Item(7, 3) = "幼儿园大班"
    Debug.Print dd.StrJoin(Chr(13), ",")
    Debug.Print
   
    '按年龄排序
    Debug.Print "年龄"
    Call dd.Sort(False, , "年龄")
    Debug.Print dd.StrJoin(Chr(13), ",")
    Debug.Print
   
    '按ID排序
    Debug.Print "ID"
    Call dd.Sort(False, , "ID")
    Debug.Print dd.StrJoin(Chr(13), ",")
    Debug.Print
End Sub

Sub cs测试克隆() '复制词典
    Dim dd As DevelopDictionary2, dd2 As DevelopDictionary2
    Set dd = New DevelopDictionary2
    dd.ColumnCount = 4 '设置列数
    dd.ColumnName(0) = "ID"
    dd.ColumnName(1) = "姓名"
    dd.ColumnName(2) = "年龄"
    dd.ColumnName(3) = "学历"
   
    dd.Item(1, "ID") = 11
    dd.Item(1, "姓名") = "张三"
    dd.Item(1, "年龄") = 25
    dd.Item(1, "学历") = "初中"
   
    dd.Item(2, "ID") = 12
    dd.Item(2, 1) = "李四"
    dd.Item(2, "年龄") = 54
    dd.Item(2, 3) = "文盲"
   
    dd.Item(7, "ID") = 4
    dd.Item(7, 1) = "张飞"
    dd.Item(7, "年龄") = 15
    dd.Item(7, 3) = "幼儿园大班"
   
   
    Set dd2 = dd.Clone '克隆
    dd2.Item(7, 3) = "大班毕业" '修改指定位置的Item
   
    Debug.Print "dd 列名:" & VBA.Join(dd.ColumnNameS, ",")
    Debug.Print dd.StrJoin(Chr(13), ",")
    Debug.Print
   
    Debug.Print "dd2 列名:" & VBA.Join(dd2.ColumnNameS, ",")
    Debug.Print dd2.StrJoin(Chr(13), ",")
    Debug.Print
End Sub

TA的精华主题

TA的得分主题

发表于 2020-7-14 16:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-15 22:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 山中老人 于 2020-7-16 10:59 编辑

嗯!更新了部分代码,将【行】(一个Key下的多个Item)用封装的数组对象ArrayObj替代,让整个数据结构更加清晰。
列号从1开始排列,0留给Key。列可以单独命名。
模仿数据库访问类Recordset,增加当前行NowRow概念,多列环境访问某个Item,可以先定行坐标,再移动列坐标,确定位置。
本身能支持字典原有所有功能,把Scripting.Dictionary看做只有两列(Key列和一个Item列)的表。
下图:
image.png 就是对列的命名,可以用它来确定列位置。
image.png 表示 列的性质和列号,也可以用它们来定位列。

image.png    表示主键Key ,用它来定位行。

捕获.JPG



2020-07-16 8:00更新附件


DevelopDictionarydd2_.rar

56.52 KB, 下载次数: 27

TA的精华主题

TA的得分主题

发表于 2020-7-17 09:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
山中老人 发表于 2020-7-15 22:18
嗯!更新了部分代码,将【行】(一个Key下的多个Item)用封装的数组对象ArrayObj替代,让整个数据结构更加 ...

楼主继续,那小板凳继续听讲

TA的精华主题

TA的得分主题

发表于 2020-7-17 11:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持字典嵌套吗?还有与传统字典相比,运行速度如何?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-17 12:20 | 显示全部楼层
larer 发表于 2020-7-17 11:30
支持字典嵌套吗?还有与传统字典相比,运行速度如何?

Dictionary 原有的所有功能保留, 使用方法不变。

Dictionary 原有功能直接传递请求,运行速度应该没变化。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 18:09 , Processed in 0.040226 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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