ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 佛山小老鼠带您走进字典(字典入门帖)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-11-4 09:58 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组集合和字典
感谢佛山分享

TA的精华主题

TA的得分主题

发表于 2013-11-4 09:59 | 显示全部楼层
老师的字典用法讲得通俗易懂,谢谢!

TA的精华主题

TA的得分主题

发表于 2013-11-4 10:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢版主分享。学习期待中。

TA的精华主题

TA的得分主题

发表于 2013-11-4 11:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-11-4 11:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-4 12:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 佛山小老鼠 于 2013-11-4 13:02 编辑
龙蒙山 发表于 2013-11-3 19:03
老师的字典用法讲得通俗易懂,非常好!谢谢!
学习“透视表式字典”有个问题请教一下:怎么样能使代码变 ...


一般大家都会认为条目是来装数据列的,,那个案例当然也是也用来装数据,不过它的数据不一样,是一个索引号,说土一点就是一个从1开始的编号,而并没有真正装工作表里的数据,用来记位置,记关键词在数组那一行,然后找到它的行,然后再到数组相应的列上累加,这样就起到了汇总

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-4 12:59 | 显示全部楼层
本帖最后由 佛山小老鼠 于 2013-11-4 13:03 编辑
ctp_119 发表于 2013-11-4 08:14
感谢老鼠老师的原创!!!


谢谢ctp_119版主的加分鼓励,真开心,继续努力

TA的精华主题

TA的得分主题

发表于 2013-11-4 15:47 | 显示全部楼层
佛山小老鼠 发表于 2013-11-3 17:59
dic.Add "不及格", 59
dic("不及格") = 59
这是两种向字典时添加关键字和条目的方法

dic.Add "不及格", 59
dic("不及格") = 59

两者都是向字典内添加关键字key和条目Item的方法。

差异如下:
方法1是 很清晰、明确的Add添加方法,

Sub test1()
    Set dic = CreateObject("Scripting.Dictionary") '后期绑定引用字典对象
   
    dic.Add "a", 1
    '标准的字典Add添加语句,可以细细分为6个部分
   '【字典对象名】【.Add】【 (空格)】【关键词】【,(逗号)】【条目内容】
   '以上内容缺一不可。

   '如果需要用括号把参数括起来,那么这么写:
    Call dic.Add("b", 2)
   '【Call】【 (空格)】【字典对象名】【.Add】【(左括号】【关键词】【,(逗号)】【条目内容】【)右括号】

   '下面写法是错误的,因为缺了【条目参数】
'    dic.Add "aa"
'    Call dic.Add("bb")
'    dic.Add "aa",
'    Call dic.Add("bb",)

'…………分割线
    '这个方法只能添加字典中不存在的【新鲜的】关键字
    ’如果再次重复添加"a",则代码报错停止
    dic.Add "a", 1

    '因此可以用以下方法处理:
    If Not dic.Exists("a") Then dic.Add "a", 1   '如果不存在"a"就新添 → 因为存在所以运行后不重复添加
    If Not dic.Exists("c") Then dic.Add "c", 3   '如果不存在"c"就新添 → 因为不存在"c" 所以可以添加

    '上述代码的完整If结构如下:   
    If Not dic.Exists("a") Then '如果不存在"a"则新添
        dic.Add "a", 11        
    Else '如果已经存在"a"则报错
        MsgBox """a"" is Exists !"
    End If
   
End Sub


这样的代码效果,就是:
可以添加关键词和条目,但后续数据中有重复的关键词时将被忽略。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-4 15:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
佛山小老鼠 发表于 2013-11-3 17:59
dic.Add "不及格", 59
dic("不及格") = 59
这是两种向字典时添加关键字和条目的方法

dic("不及格") = 59
第二种方法的说明:

第2种方法,其实是一种字典变量操作的过程简化。
因为,dic(【关键词】)=条目  即: dic(Key)=Item

所以本质上如下:

Sub test2()
    Set dic = CreateObject("Scripting.Dictionary")
   
    dic("a") = 1
    '如果"a"为新关键字,那么相当于如下字典Add新添语句的作用
    dic.Add "a", 1
   
    '如果"a"为已有关键字
    dic("a") = 2
   
    '那么相当于如下字典操作:   
    If Not dic.Exists("a") Then
        dic.Add "a", 2
    Else
        dic.Remove "a"
        dic.Add "a", 2
    End If
        
End Sub


TA的精华主题

TA的得分主题

发表于 2013-11-4 16:19 | 显示全部楼层
本帖最后由 香川群子 于 2013-11-5 00:12 编辑

字典赋值方法2的进一步解释:

dic(kye)=dic(kye)+NewItem

Sub test3()
    Set dic = CreateObject("Scripting.Dictionary")
   
    x = 100
    dic("a") = x '字典中关键词"a"加入变量x=100
   
    t = dic("a") '检查字典中关键字"a"对应的条目结果t
    If IsEmpty(t) Then '如果结果为空集→ 即相当于该关键词不存在,等效于Not dic.Exists("a")
        dic.Add "a", x '那么以x变量为条目把关键词"a"加入字典
    Else
        dic.Remove "a"
        dic.Add "a", x '如果已有条目值t (相当于dic.Exists("a")=True)
      '那么以 x 作为新的条目结果重新把关键词"a"加入字典
    End If
   
   
   
    y = 1
    dic("a") = dic("a") + y  '本句要求关键词"a"对应条目结果t和现在的变量y相加!
   
    t = dic("a")'检查字典中关键字"a"对应的条目结果t
    If IsEmpty(t) Then '等于 If IsEmpty(dic("a")) Then  '等效于 If Not dic.Exists("a") Then
        dic.Add "a", y
    Else
        dic.Remove "a"
        dic.Add "a", t + y
        '那么以 t + y 作为新的条目结果重新把关键词"a"加入字典
    End If
   
End Sub

上述代码中,IsEmpty(t1)


结论:
dic(kye)=Item 以及 dic(kye)=dic(kye)+NewItem
的字典条目赋值方法,非常有优势,是字典入门以后的必然选择。

总结:
如果需要和dic.Add方法结果保持一致,(即只以第一次出现的关键词对应条目作为字典结果)
那么代码为:
If Not dic.Exists(key) Then dic(kye)=Item

如果以最新(最后一次出现)的关键词对应条目作为字典结果
那么代码最简明:
dic(kye)=Item → 即条目随时更新

同时,可以直接对条目进行汇总、合并等方法进行灵活处理:

dic(kye)=dic(kye)+NewItem (数值型数据时,用来加总统计)

或 dic(kye)=dic(kye) & "," & NewItem (作为文本字符串合并)



…………
因此,事实上,一般说 dic.Add 语句方法已经是高手所不需要的语句了。



评分

3

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-15 17:49 , Processed in 0.045014 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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