ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 字典基本语句、以及中级字典运用例子

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-14 14:36 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组集合和字典
必须得顶,本人是字典对象的忠实信徒,没有字典,VBA将失去多少光彩

TA的精华主题

TA的得分主题

发表于 2014-11-14 14:42 | 显示全部楼层
想问问有没有不相邻的几个单元批量清空的指令...

TA的精华主题

TA的得分主题

发表于 2014-11-14 15:04 | 显示全部楼层
本帖最后由 引子玄 于 2014-11-14 15:07 编辑
香川群子 发表于 2014-9-25 15:26
字典的作用:

字典的最重要作用有以下:


字典的三大作用:
一、任意关键词快速查询
二、检查并处理重复关键词
三、一一对应并记录、更新关键词对应项目内容(合并、统计、分组……等等)

概括得好!

TA的精华主题

TA的得分主题

发表于 2014-11-15 00:05 | 显示全部楼层
引子玄 发表于 2014-11-14 15:04
字典的三大作用:
一、任意关键词快速查询。
二、检查并处理重复关键词

谢谢香川群子老师!

TA的精华主题

TA的得分主题

发表于 2014-11-15 16:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-17 12:42 | 显示全部楼层
关于把Range()或Cells()作为字典关键词时的问题补充:
  1. Sub test() 'by kagawa
  2.     Dim d As New Dictionary '前期绑定
  3.    
  4.     Dim rg1 As Range, rg2 As Range, rg3 As Range, rg4 As Range
  5.     Set rg1 = Range("a1") '设置变量rg1为单元格A1的Range对象引用
  6.     Set rg2 = Range("a2") '设置变量rg2为单元格A2的Range对象引用
  7.     Set rg3 = rg1  '设置变量rg3=变量rg1 仍为单元格A1的Range对象引用
  8.     Set rg4 = rg2  '设置变量rg4=变量rg2 仍为单元格A2的Range对象引用
  9.    
  10.     d.Add rg1, rg1 '用此语句添加字典关键词(此时字典中有了第1个key)
  11.     '注意 ① 不可重复添加字典中已有的关键词
  12.     '       ② 此时添加的关键词Keys是rg1变量、指向单元格A1的Range对象引用
  13.                 但并非等同于直接把单元格A1的Range对象作为关键词!
  14.     '       ③ 此时加入的Item是rg1变量、即指向单元格A1的Range对象引用

  15.     MsgBox d(rg1) '读取rg1变量作为关键词key时的Item内容rg1指向的单元格A1(默认引用.Value值)
  16.     MsgBox d(rg1).Value '可以读取rg1变量作为关键词key时的Item内容rg1指向的单元格A1的值
  17.    
  18.     MsgBox d(rg2) '由于此时字典中并不存在rg2,所以按照d(keys)=""的语法把rg2加入字典
  19.     '(此时字典中有了第2个key)
  20.     '注意 ① 如字典中已有关键词则引用item内容,如无则加入该关键词
  21.     '       ② 此时添加的关键词Keys是rg2变量、指向单元格A1的Range对象引用
  22.                 但并非等同于直接把单元格A1的Range对象作为关键词!
  23.     '       ③ 此时加入的Item是""空白!所以Msgbox返回空白

  24.     d(rg2) = rg2   '用此语句更新或添加字典关键词对应的内容
  25.     '       ③ 此时加入的Item是rg2变量的.Value值!而不是指向单元格A1的Range对象引用!
  26.     '(此时字典中仍为2个key,但第2个key的item内容得到了更新)
  27.     MsgBox d(rg2) '读取rg2变量作为关键词key时的Item内容rg2的.Value值
  28. '    MsgBox d(rg2).Value '此句出错无法执行!因为Item内容为rg2的.Value值,不是单元格A2的引用
  29.    
  30. '    d.Add rg3, rg3 '此句出错无法执行!因为rg3就是rg1,而rg1已经在字典中无法再次添加!
  31.     MsgBox d(rg3) '读取rg3变量即rg1作为关键词时的Item内容rg1指向的单元格A1(默认引用.Value值)
  32.     MsgBox d(rg3).Value '读取rg3变量即rg1作为关键词key时的Item内容rg1指向的单元格A1的值
  33.     '(此时字典中仍只有2个key)

  34.     MsgBox d(rg4) '读取rg4变量即rg2作为关键词key时的Item内容rg2的.Value值
  35. '    MsgBox d(rg4).Value'此句出错无法执行!因为Item内容为rg2的.Value值,不是单元格A2的引用
  36.     '(此时字典中仍只有2个key)
  37.    
  38.     MsgBox d(Range("a1")) '由于此时字典中并不存在Range("a1")代表的变量
  39.     '所以按照d(keys)=""的语法把Range("a1")加入字典
  40.     '(此时字典中有了第3个key)
  41. '    MsgBox d(Range("a1")).Value'此句出错无法执行!因为Item内容为""空白,不是单元格A1的引用
  42.    
  43.     kr = d.Keys  '取出所有keys……一共是3个:rg1、rg2、Range("a1")代表的变量
  44.     '注意Range("a1")代表的变量可能是个活动变量,
  45.     '因此每次使用d.Add Range("a1"),"" 或 d(Range("a1"))="" 都能进行新的字典key添加……
  46.     '但也因为如此,无法依据活动的Range("a1")变量取得对应的Item内容。
  47.     '即,(每次相同的Range("a1")变量,都会被当做新的不同的key!)

  48.     tr = d.Items '取出所有Items……一共是3个:A1单元格的引用、A2单元格的Value值、""空白值
  49.     Stop '暂停以便观察
  50.    
  51.     MsgBox "rg1: " & d(rg1) & vbCr & "rg2: " & d(rg2) & vbCr & "rg3: " & d(rg3) & vbCr & "rg4: " & d(rg4)
  52.     '返回: rg1=A1值 rg2=A2值 rg3=A1值 rg4=A2值
  53. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-17 12:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以下测试表明,直接把Range()或Cells()变量作为关键词key加入字典是毫无意义的……无法使用。
  1. Sub test2()
  2.     Dim d As New Dictionary
  3.    
  4.     For i = 1 To 3
  5.         d.Add Range("A" & i), Range("A" & i)
  6.     Next
  7.     Debug.Print d.Count
  8.    
  9.     For i = 1 To 3
  10.         d.Add Range("A" & i), Range("A" & i)
  11.     Next
  12.     Debug.Print d.Count
  13.    
  14.     For i = 1 To 3
  15.         Debug.Print i; d(Range("A" & i)); "End"
  16.     Next
  17.     Debug.Print d.Count
  18.    
  19.     For i = 1 To 3
  20.         d.Add Cells(i, 1), Cells(i, 1)
  21.     Next
  22.     Debug.Print d.Count
  23.    
  24.     For i = 1 To 3
  25.         Debug.Print i; d(Cells(i, 1)); "End"
  26.     Next
  27.     Debug.Print d.Count
  28.    
  29.     kr = d.Keys: tr = d.Items
  30.     Stop
  31. End Sub
复制代码
因为每次都会被当做不同的、新的key……失去了用字典记录、查询、引用关键词key的意义。

TA的精华主题

TA的得分主题

发表于 2014-12-25 22:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-1-10 19:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-1-16 09:26 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 12:11 , Processed in 0.042071 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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