ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 字典求解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-12 04:42 | 显示全部楼层 |阅读模式
跪求各位老師教下小弟字典用法~~~實在不明白以下兩個程序,為什麼結果會不一樣?
Sub 重覆1()
Dim d, k, t, arr
Dim i As Integer
Range("J:K").ClearContents
Set d = CreateObject("scripting.dictionary")
arr = Range("A1").CurrentRegion
For i = 2 To UBound(arr)
    d(arr(i, 3)) = d(arr(i, 3)) + 1   '<<--具體只有這行不同
Next
k = d.keys
t = d.items
Range("J1:K1") = Array("姓名", "重覆個數")
Range("J2:J" & d.Count + 1) = Application.Transpose(k)
Range("k2:K" & d.Count + 1) = Application.Transpose(t)
Set d = Nothing
End Sub

Sub 重覆2()
Dim d, k, t
Dim rng As Range
Set d = CreateObject("scripting.dictionary")
Range("N:O").ClearContents
For Each rng In Range("C2:C" & Range("C2").End(xlDown).Row)
    d(rng) = d(rng) + 1   '<<--具體只有這行不同
Next
k = d.keys
t = d.items
Range("N1:O1") = Array("姓名", "重覆個數")
Range("N2:N" & d.Count + 1) = Application.Transpose(k)
Range("O2:O" & d.Count + 1) = Application.Transpose(t)
Set d = Nothing
End Sub


如圖所示,結果是程序:重覆1()那個才正確的,我有以下3個問題:
(一) 明明arr(i,3) 應該等於 rng,我實在不明白為何會有出入?
(二) 字典裏不是不能夠含有重覆的Key嗎?為什程序:重覆2() 仍然能運行?
(三)  d(arr(i, 3)) = d(arr(i, 3)) + 1  <--這句真心不能理解,各位老師能多作解釋嗎?(平時用字典都要add方法加Key的,這句什麼時候讓字典加Key了?)
1.png

字典 - 複製.zip

17.54 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2018-8-12 08:40 来自手机 | 显示全部楼层
d(Arr(i, 3)) = d(Arr(i, 3)) + 1
Arr(i,3)是姓名列,也就是关键字列,举个例子,假如Arr(i,3)=”张三”,这句代码的意思就是把关键字”张三”加入字典,d(key)等于关键字key对应的项,每出现一次这个关键字,它的项的值就增加1。起到了按关键字累加的作用

d(rng) = d(rng) + 1
这句错误的原因是:key关键字 rng是一个单元格对象,不是文本或数据。
应该改为
d(rng.value) = d(rng.value) + 1

TA的精华主题

TA的得分主题

发表于 2018-8-12 08:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1、应该是 d(rng.Value) = d(rng.Value) + 1  value属性该省的时候可以省,不该省的时候不能省
2、程序2写的没有问题,当然可以运行,因为你程序2字典的key当中存储的是Range对象,而Range对象都不相同
3、 d(arr(i, 3)) = d(arr(i, 3)) + 1   就是跟 add方法加Key 是等效的,只不过d(arr(i, 3)) = d(arr(i, 3)) + 1 写起来方便点

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-12 09:07 | 显示全部楼层
d(rng)不等于d(rng.value)
前者是单元格对象,所以出错。后者是单元格的值
有一种写法:
x = Arr(i, 3)
        If Not d.exists(x) Then
             d.Add x, 1
        Else
             d(x) = d(x) +1
        End If
解释为:
如果字典d中不存在关键字x,那么把关键字x,把它出现的次数1作为项一起加入字典d,注意,是一对数据加入,也可以写为:d(x)=1
如果又出现一次同样的x,那么次数+1=2,写作d(x)=d(x)+1

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-12 11:04 来自手机 | 显示全部楼层
平时在取不到返回值时,对关键字加vaLue,经两老师精辟讲解,终于知道为什么。

TA的精华主题

TA的得分主题

发表于 2018-8-12 15:46 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-12 15:56 | 显示全部楼层
我明白了!!其實 d(x) = d(x) +1 ,即是d.item(x) = d.item(x) +1 吧!!只不過簡寫了所以一直不明白!
如果一開始看到這個可能會明白多了:
If Not d.exists(x) Then
    d.Add x, 1
Else
    d.item(x) = d.item(x) +1
End If
感謝各位老師賜教!!

TA的精华主题

TA的得分主题

发表于 2018-8-12 19:23 | 显示全部楼层
Johnnyc 发表于 2018-8-12 15:56
我明白了!!其實 d(x) = d(x) +1 ,即是d.item(x) = d.item(x) +1 吧!!只不過簡寫了所以一直不明白!
如果一 ...

你应该动手试试再说明白不明白                                                                                       

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-12 20:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小花鹿 发表于 2018-8-12 19:23
你应该动手试试再说明白不明白                                                                       ...

我就是已經過了,結果發現是一樣的。d(x) = d(x) +1 確實等於 d.item(x) = d.item(x) +1
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 22:42 , Processed in 0.044450 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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