Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 15984|回复: 36

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

[复制链接]
发表于 2007-9-29 04:03 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2012-7-6 19:56 编辑

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

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

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

如有错漏,欢迎指正。

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

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

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

http://club.excelhome.net/dispbbs.asp?boardID=2&ID=265056&page=1&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 可以把它想象成一个 垃圾桶 什么都可以 往里面装。
数字,字符串,数组,对象(窗体,控件,文件。。。。),

由于字典是不可见,抽象的,下面的表格只能想象
字典
key itme
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 ("结果集") 


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

QUOTE:
以下是引用hhzjxss在2007-9-29 10:25:14的发言:

高深,下载示例看了都不知道是啥东东!

汗 我还以为写的很通俗了

当老师天分欠缺[em01]

回复

使用道具 举报

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

汗  4:03:45  楼主实在是敬业,对楼主表示敬佩。

回复

使用道具 举报

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

高深,下载示例看了都不知道是啥东东!

回复

使用道具 举报

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

谢谢版主的分享,例子通俗易懂啊。[em17]
回复

使用道具 举报

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

谢谢楼主的好“东东”!下载留着慢慢学习消化!
回复

使用道具 举报

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

非常感谢!

认真学习

灵活应用

回报老师

是否可再进行这样VBA难点问题的讲座!!!!期待!

[此贴子已经被作者于2007-9-29 20:03:46编辑过]
回复

使用道具 举报

发表于 2007-9-30 01:12 | 显示全部楼层

学习啊~~

回复

使用道具 举报

发表于 2007-9-30 04:02 | 显示全部楼层

学习
回复

使用道具 举报

发表于 2007-9-30 05:12 | 显示全部楼层

学习
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 20:24 , Processed in 0.431355 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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