ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 字典求救

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-7 11:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一望无垠 发表于 2013-5-6 14:15
看看我的理解是否正确:
两个表6个关键词中的4个只有出现一次的关键词
两个表全部去掉重复的关键词

d(arr(i,1))=""是如何选出不重复名字来的呢?我是这样理解的:1)d(arr(i,1))=""是d.add arr(i,1),""的变形写法:2)字典d添加的项目本身就不会重复;

TA的精华主题

TA的得分主题

发表于 2013-5-7 13:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主精神可嘉了,说实话,我也是为工作而学,包括表格处理,文本处理,图像处理,网页处理等等,但如果退休了,学而无用啊,家庭中几乎是用不上的,没了目标,就没了动力

TA的精华主题

TA的得分主题

发表于 2013-5-7 13:05 | 显示全部楼层
smhf_6 发表于 2013-5-7 13:02
楼主精神可嘉了,说实话,我也是为工作而学,包括表格处理,文本处理,图像处理,网页处理等等,但如果退休 ...

家中怎么会没用呢。
今天花了二分钱买酱油,明天花了三分钱买盐,这些都需要记账。
账户处理绝对有用。

TA的精华主题

TA的得分主题

发表于 2013-5-7 14:43 | 显示全部楼层
本帖最后由 清风幽闲 于 2013-5-7 14:46 编辑

for n=1 to d.count
      cells(n,1)=d.keys(n-1)
next n
这样在A列就显示出你的字典内容,字典的索引号和数组一样,是从0开始的

TA的精华主题

TA的得分主题

发表于 2013-5-7 15:21 | 显示全部楼层
一望无垠 发表于 2013-5-6 14:15
看看我的理解是否正确:
两个表6个关键词中的4个只有出现一次的关键词
两个表全部去掉重复的关键词


楼主还没有理解d(Arr(i,1))=""是如何把不重复的名字弄出来的?
很简单,如果字典中没有Arr(i,1)这个键值,d(Arr(i,1))=""的意思就是添加一个键值,如果字典中已经有了这个键值,d(Arr(i,1))=""就再重复或覆盖一次
把字符"a"添加到字典键值d("a")="",不管添加几遍,键值也只有一个"a"
使用数组比喻一下:
有一个数组arr(1 to 9),把键值比作数组中的下标,arr(1)=""写上一百遍,下标还是1

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-7 16:10 | 显示全部楼层
zhaogang1960 发表于 2013-5-7 15:21
楼主还没有理解d(Arr(i,1))=""是如何把不重复的名字弄出来的?
很简单,如果字典中没有Arr(i,1)这个键值 ...

谢谢赵老师和各位热心人。
其实d(Arr(i,1))=""的关键字不重复,我是理解的。
可能是我刚开始理解“列出不重复的名字”有误:
比如表1有 ABCD 四人
      表2有 CDEF 四人
这样“列出不重复的名字”就是ABCDEF六人,而我原来的理解是,求不重复的,只有ABEF四人,CD都重复了,不能计算在内。
所以一直在质疑 d(Arr(i,1))="" 怎么能求出 ABEF 四个人。

点评

这是另外的一种“不重复”,使用两个字典即可  发表于 2013-5-7 16:13

TA的精华主题

TA的得分主题

发表于 2013-5-7 16:22 | 显示全部楼层
本帖最后由 香川群子 于 2013-5-8 11:32 编辑
xd3210 发表于 2013-5-7 11:04
d(arr(i,1))=""是如何选出不重复名字来的呢?我是这样理解的:1)d(arr(i,1))=""是d.add arr(i,1),""的变 ...


对于楼主的问题:【字典语句 d(arr(i,1))="" 是如何排除重复项的?】

21楼的解释是正确的。


但可能楼主还是没有看懂你的说明。


…………
对于楼主的这个问题,可能需要更直接、更现实的比喻来说明。

1. 字典
字典是一种脚本工具ScriptingTool,相当于是一个【暗箱盒子】

所谓【暗箱盒子】就是,你输入一些参数、变量,
这个【暗箱盒子】就按照一定的规则对你的输入的参数、变量进行加工,
然后直接【输出】加工后的结果。

这个加工过程是已经封装好的、复杂的代码。因此【并不需要你知道详细过程】。

楼主你同意这个观点么?


如果同意,我们就继续。


2. 字典 规则
所谓字典规则,就是这个【暗箱工具】处理问题的原则。

规则如下:
a. 字典建立
Set d = CreateObject("Scripting.Dictionary")

或 Dim d as New Dictionary

推荐用第一种语句。
(第2种语句功能更强大,但需要事先做好字典的功能的加载引用。)
加载 C:\WINDOWS\SYSTEM32\SCRRUN.DLL (直接运行 regsvr32 scrrun.dll)
或在VBE中引用 Microsoft Scripting Runtime


b. 字典关键字/词 即key的添加

  标准语句 dic.Add key1, item1
   简写语句 d(key1) = item1

解释: 字典实际上也可以看做是数组或集合,
字典拥有的每一个元素具有2个不同属性的数据,而且它们是成对出现的。
即key 和对应的 item

它们的特性如下:
1. key是唯一的。
2. itme无唯一性限制,但item从属于key,也就是说item是key的关联/或附加信息。

字典功能启动以后,你在每次添加key时:
【字典暗箱】会自动比对是否已经有相同值,
确认没有就作为新的key加入字典,即字典中的元素增加了。

但如果确认已经有重复key存在,那么就【不再增加字典元素】了。
但是,可以根据你的要求,对该key的item内容进行修改,
或者不管三七二十一赋予一个任意的内容
  ……习惯上让它="",这个就是 d(arr(i,1))="" 的来历。



这里还可展开来,讲很多内容……暂且略过。


于是最后,当你利用【字典暗箱】检查比对完成所有arr(i,1)内容后,
就会得到一个仅仅由不重复的key组成的数组集合d.keys

把它读取出来,就得到了字典的关键字的不重复项。


至于item内容,是【字典暗箱方法】中可以进一步扩展的内容,

但如果楼主的目的仅仅是排除不重复项目,那么就完全不用去理会item项目属性了。


这个,就是只需要遍历执行 d(arr(i,1))=""  这么简单的一句,就能排除重复项的原因。


具体暗箱的逻辑作用可以解释为:

for i = 1 to ubound(arr)
    if arr(i,1) is new key then
      d.add new key as item = ""
   elseif arr(i,1) is old key then
     d. old key as item = ""
   endif
next

注意: 上面这几句代码只是逻辑说明,不是可执行的语句代码。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-7 16:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
正常情况下只需知道如何进,如何出就行了,中间的过程没必要去深入研究。如同吃饭与拉屎,普通人吃需知道如何吃饭,到什么地方去排泄就行。至于米饭中的营养成份是如何被人体吸收的那是生理学家的事,没必要去关心。

TA的精华主题

TA的得分主题

发表于 2013-5-7 16:44 | 显示全部楼层
字典添加关键字的用法实例和差别说明:

刚才说到,字典关键字/词 即key的添加时:

  标准语句 dic.Add key1, item1
   简写语句 d(key1) = item1

那么,又为何大家都只用简写语句呢?

其实用简写语句效果更好。例子如下:



Sub test()
   
    Set dic1 = CreateObject("Scripting.Dictionary")
           '新建字典dic1
    dic1("a") = 1
           '加入new key "a",并对其item赋值=1
    dic1("a") = 2
            '想要加入key "a" 时,自动确认key "a" 已经存在,因此作为old key处理并不需要添加new key,
        '并对其item【重新】赋值=1
   '显然,如果每次赋值都是="" 也足以完成【字典排除重复关键词】的作用了。


     '下面测试语句 2
   
    Set dic2 = CreateObject("Scripting.Dictionary")
         '建立字典dic2
    dic2.Add "a", 1
         '把关键字"a" 作为new key加入字典,并赋值=1
    dic2.Add "a", 2
         '想要把关键字"a" 作为new key加入字典时出错! 语句无法继续。

   '也就是说,dic.add key, item 语句方法,只能对字典进行添加不重复key并进行item赋值的操作,
    '而当key为重复old值时,无法进行添加关键词的操作而产生错误。
      
         
End Sub



实际上,d.add 方法是需要和d.Exists 方法组合起来使用的。

排除重复key的代码例子如:

Sub test2()
    arr = [a1:b10]
    Set dic = CreateObject("Scripting.Dictionary")
   
    For i = 1 To UBound(arr)
        If Not dic.Exists(arr(i, 1)) Then dic.Add arr(i, 1), ""
    Next
   
End Sub

或许这样的代码写法,楼主更容易理解。

dic.Exists(key) 是判断某个关键词是否已经在字典中存在的方法。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-7 16:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一望无垠 发表于 2013-5-7 16:10
谢谢赵老师和各位热心人。
其实d(Arr(i,1))=""的关键字不重复,我是理解的。
可能是我刚开始理解“列出 ...

你应该说把重复的关键字去掉
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-14 06:31 , Processed in 0.025693 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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