ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]DICTIONARY(字典)对象 补遗(一)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-9-29 04:10 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数组集合和字典

很早以前就在写 字典的应用及实例,可写文章对我来说实在是件苦差。

写了一小部分就停下来了。好在狼版写了 浅谈DICTIONARY(字典)对象

我这里只补充部分他没有提到的东西就轻松多了,尽管如此还是很零乱。

如有错漏,欢迎指正。

标题里有个(一)并不表示一定就有(二),之所以要留个(一)为了其他对字典了解的朋友

续写补遗留个空间,便于大家查找。

浅谈DICTIONARY(字典)对象---狼版

http://club.excelhome.net/viewthread.php?tid=265056&px=0

创建字典的两个方法
1 引用 c:\windows\system32\scrrun.dll 然后 dim d as new Dictionary
2 Set d = CreateObject("Scripting.Dictionary")
字典的四个属性
    CompareMode     决定key的比较方法 BinaryCompare(默认方法) 二进制方式比较,即a,A是不同字符
        TextCompare    '文本方式比较,即a,A是相同字符
        vbDatabaseCompare   仅用于 Microsoft Access。进行基于您自己数据库中信息的比较。
        如果用recordset做key的话vbDatabaseCompare方式就有用了,因为用的少没有测试过
    Count       计算字典中的条目数量  s = d.count  s 是一个long值
    Key     也就是Item的代码通常是整数或字符串,可以是除数组外的任何类型,在一个字典中每一个key都是唯一的
        一般利用这个特点去除重复值
    Item        可以是任何对象(不含自定义数据):数字,字符串,数组,对象(窗体,控件,文件。。。。)
字典的六个方法
    Add     向字典添加内容 d.add "a",10000,或 d("王先生")= "010-87654321"
        向字典添加对象 set d("mysheet") = Sheet1 Set d("mybook") = ThisWorkbook
        注意 set 关键字
    Exists      判断keys中有没有要找的key,返回 true 或 false
        s = d.exists("王先生"), s 是 true 因为上面已经添加了王先生
    Keys        学过英文吧?Key的复数形式,返回一个一维数组 arr= d.keys
    Items       同上   arr = d.items
    Remove      按照key从字典中删除一个项目 d.remove("王先生")
    RemoveAll       清空字典 d.RemoveAll  此时 d.count 为 0

字典简单,好学又好用 总共10种属性方法,用过字典或自学能力强的看到这里,可以不用往下看了

 

字典就像一个只有两列的表,字典的行数可以有多少?
取决于内存的大小。字典更像数据库,数组的混合体
字典的两个列的“名字” 分别是 “key” 和 “item”
key 是 item 的 “代号” 方便我们在程序中调用
key通常是整数或字符串,可以是除数组外的任何类型
注意数字1 和字符串“1”是不同的
item 可以把它想象成一个 垃圾桶 什么都可以 往里面装。
数字,字符串,数组,对象(窗体,控件,文件。。。。),

由于字典是不可见,抽象的,下面的表格只能想象
字典
keyitme
1一个数组
1一个窗体
abc一个sheet
88字符串
一个图片
字符串
数字
字符串
…………
表1
姓名电话
张三123456
李四654321


       
字典的一个最大特点是 可以通过“代号”--key,也可以
通过顺序引用 如果表1是个2维数组
要取得张三的电话,只能用 电话=表1(0,1) 表示
如果不知道张三在表中的位置,只能先用循环取得张三的位置
       
但如果表1 是字典的话,取得张三的电话就容易的多了
电话=表1("张三"),也可以  电话=表1(表1.keys(0))
       
keys 和 items
字典中的两列可以单独用两个一维数组分别表示
arr1 = 表1.Keys
arr2 = 表.Items

CompareMode 比较方式
TextCompare 文本方式比较,即a,A,a ,A 是相同字符
BinaryCompare '二进制方式比较,即a,A,a ,A 是不同字符
vbDatabaseCompare   仅用于 Microsoft Access。进行基于您自己数据库中信息的比较。
但不论哪种方式,数字的 123 和  字符串的"123" 永远不同

一些应用技巧
呼之即来
    把arr数组中的重复值去除
        Dim d As New Dictionary
        arr = Array(1, 1, 1, 1, 2, 3, 22, 4, 2, 24, 8, 5, 5, 4, 5, 4, 43, 6, 8, 9, 0, 0)
        For i = 0 To UBound(arr)
            s = d(arr(i))
        Next
    arr = d.Keys
以上代码并没有用到add方法但更快速的完成了任务
如果使用add方法,就要增加错误处理 或先用Exists判断一下

变量总集 (不含自定义数据)
    如果你的程序里有许多公共变量
Public aa As String, mysheet As Worksheet, cc As Long
Public rc As New Recordset, rg As Range, dd As New Dictionary

如果使用字典,一个变量就搞掂
Public d As New Dictionary
在程序中随时添加,随时引用,随时删除 灵活性很大

添加:
    d("字串1") = "你好"
    Set d("表1") = Sheet1
    d("长整型1") = 10000
    Set d("结果集") = New Recordset
    Set d("单元格") = Sheet1.Range("a1:b5")
    Set d("字典") = New Dictionary
引用:
    Set rc = d("结果集")
    rc.Open ………
    或直接使用 d("结果集").open………
删除:
    d.Remove ("结果集")  

gvIJBHFD.rar (16.98 KB, 下载次数: 1293)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-29 04:18 | 显示全部楼层
总感觉没写完,可又写不出什么特别的了,以后想到再补充吧。

TA的精华主题

TA的得分主题

发表于 2007-9-29 04:33 | 显示全部楼层
不错!希望论坛多推出此类的教程,与我等菜鸟是大大的有益!!!

TA的精华主题

TA的得分主题

发表于 2007-9-29 06:33 | 显示全部楼层

在狼兄那里我提了一个问题,可能是我没说清楚,没有结果,在此我还是要问一下:

在“Add     向字典添加内容 d.add "a",10000,或 d("王先生")= "010-87654321"”中,

凡是我所看到的例子,都是这样,一个key,一个item,一个key没错,但在实际工作中,一个item是不够的,比如本例中,王先生,除了电话,还有地址,日期,等多项内容。

所以是先用join,后用解决split,当然麻烦,是否还有好的办法?

TA的精华主题

TA的得分主题

发表于 2007-9-29 08:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-9-29 08:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
[em17][em17][em17]

TA的精华主题

TA的得分主题

发表于 2007-9-29 08:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

ldy888兄,

04:10AM发贴,精神可嘉.

我是白天睡觉,你好像是晚上不睡觉嘛^_^

TA的精华主题

TA的得分主题

发表于 2007-9-29 08:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以下是引用smhf_6在2007-9-29 6:33:54的发言:

在狼兄那里我提了一个问题,可能是我没说清楚,没有结果,在此我还是要问一下:

在“Add     向字典添加内容 d.add "a",10000,或 d("王先生")= "010-87654321"”中,

凡是我所看到的例子,都是这样,一个key,一个item,一个key没错,但在实际工作中,一个item是不够的,比如本例中,王先生,除了电话,还有地址,日期,等多项内容。

所以是先用join,后用解决split,当然麻烦,是否还有好的办法?

这就说明了论场中大部分有关字典使用的例子中都是字典+数组的原因了!

TA的精华主题

TA的得分主题

发表于 2007-9-29 10:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太棒了!!!受益非浅啊!

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-29 10:49 | 显示全部楼层
QUOTE:
以下是引用oobird在2007-9-29 8:46:51的发言:
以下是引用smhf_6在2007-9-29 6:33:54的发言:

在狼兄那里我提了一个问题,可能是我没说清楚,没有结果,在此我还是要问一下:

在“Add     向字典添加内容 d.add "a",10000,或 d("王先生")= "010-87654321"”中,

凡是我所看到的例子,都是这样,一个key,一个item,一个key没错,但在实际工作中,一个item是不够的,比如本例中,王先生,除了电话,还有地址,日期,等多项内容。

所以是先用join,后用解决split,当然麻烦,是否还有好的办法?

这就说明了论场中大部分有关字典使用的例子中都是字典+数组的原因了!

一个item是够用了吧? item可以装 数组、recordset、range、甚至再套一个字典。

set  d("王先生") = new Dictionary

 d("王先生") ("TEL")= "010-87654321"

d("王先生") ("MOB")= "13988888888"

d("王先生") ("QQ")= "45678900"

d("王先生") ("父")= "王老四"

d("王先生") ("子")= "王小明"

如有必要可以把他们家的家谱都写进去 [em10]

要查他的手机   msgbox  d("王先生") ("MOB")

 

 

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

本版积分规则

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

GMT+8, 2024-12-22 12:16 , Processed in 0.051041 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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