Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!

[分享] 我学习字典使用

[复制链接]
发表于 2008-1-20 17:01 | 显示全部楼层

QUOTE:
以下是引用ldy在2007-9-30 13:04:00的发言:

这句写法不规范,但也能运行,效率低,字典处理了三次 包括一次纠错(字典还能纠错??!!)

d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5)  

效果同下

d(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)  

d.key(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)  

请ldy版版解释一下,这里是如何等同的??单看这三句,上面一句的结果和下两句的结果,最终的key都不一样啊(如果有前后语句的情况另外再考虑)

下面两句,第一句,给d(Cells(I, 1).Value)重新赋新的Item值,第二句,给d(Cells(I, 1).Value)赋新的key值,这怎么和第一句效果一样??第一句的key一直没有变啊?

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2008-1-20 19:34 | 显示全部楼层
回复

使用道具 举报

发表于 2008-1-20 19:48 | 显示全部楼层

QUOTE:
以下是引用uranus1997在2008-1-20 17:01:00的发言:
QUOTE:
以下是引用ldy在2007-9-30 13:04:00的发言:

这句写法不规范,但也能运行,效率低,字典处理了三次 包括一次纠错(字典还能纠错??!!)

d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5)  

效果同下

d(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)  

d.key(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)  

请ldy版版解释一下,这里是如何等同的??单看这三句,上面一句的结果和下两句的结果,最终的key都不一样啊(如果有前后语句的情况另外再考虑)

下面两句,第一句,给d(Cells(I, 1).Value)重新赋新的Item值,第二句,给d(Cells(I, 1).Value)赋新的key值,这怎么和第一句效果一样??第一句的key一直没有变啊?

疏忽了,已在原贴中修改了

 

回复

使用道具 举报

 楼主| 发表于 2008-1-20 20:57 | 显示全部楼层

再次学习了!

但对老师的d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5)与d(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)等效的问题还是不理解,感觉应当是与d(Cells(I, 1).Value) = d(Cells(I, 1).Value)  + Cells(I, 5)效吧?

回复

使用道具 举报

发表于 2008-1-20 22:12 | 显示全部楼层

QUOTE:
以下是引用青城山苦丁茶在2008-1-20 20:57:00的发言:

再次学习了!

但对老师的d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5)与d(Cells(I, 1).Value) = Cells(I, 1) + Cells(I, 5)等效的问题还是不理解,感觉应当是与d(Cells(I, 1).Value) = d(Cells(I, 1).Value)  + Cells(I, 5)效吧?

苦丁茶兄弟对的。

有时我很粗心。不要学我[em04]

回复

使用道具 举报

发表于 2008-1-21 09:01 | 显示全部楼层

d(Cells(I, 1).Value)   vs   d(Cells(I, 1))

Cells(I, 1)是一个对象,以一个单元格对象作为key,会产生意想不到的错误的;

而Cells(I, 1).Value是Cells(I, 1)对象的值,当然也可以用Cells(I, 1).text

回复

使用道具 举报

发表于 2008-1-21 12:55 | 显示全部楼层

字典”是啥东东还搞不明白!
回复

使用道具 举报

 楼主| 发表于 2008-1-21 14:30 | 显示全部楼层

好久的贴子了,再发点字典与数组的学习吧:

设当前表的A列为姓名,B列为部门,C到F列为数值,数据在3-12行。现需按部门进行分类汇总,有以下两种写法(方法二为模仿oobird):

Sub test1()   '示字典的item为数组的用法:
Dim d As New Dictionary, arr1(), i As Integer
For i = 3 To 12
  If d.Exists(Cells(i, 2).Value) Then
      arr1 = d(Cells(i, 2).Value)
  End If
  ReDim Preserve arr1(1 To 4)
  arr1(1) = arr1(1) + Cells(i, 3)   '这四行也可用循环,不过据说循环次数不多从速度上来说还不如不用
  arr1(2) = arr1(2) + Cells(i, 4)
  arr1(3) = arr1(3) + Cells(i, 5)
  arr1(4) = arr1(4) + Cells(i, 6)
  d(Cells(i, 2).Value) = arr1
  Erase arr1
Next
[a20].Resize(d.Count, 4) = Application.Transpose(d.Keys)    '写入部门
[b20].Resize(d.Count, 4) = Application.Transpose(Application.Transpose(d.Items))   '写入汇总结果
End Sub


Sub test2()   '字典起到记录一部门在数组中位于哪列的作用
Dim d As New Dictionary, arr1(), i As Integer, m As Integer
m = 0
For i = 3 To 12
  If Not d.Exists(Cells(i, 2).Value) Then
      m = m + 1
      d(Cells(i, 2).Value) = m
      ReDim Preserve arr1(1 To 4, 1 To m)
  End If
  arr1(1, d(Cells(i, 2).Value)) = arr1(1, d(Cells(i, 2).Value)) + Cells(i, 3)
  arr1(2, d(Cells(i, 2).Value)) = arr1(2, d(Cells(i, 2).Value)) + Cells(i, 4)
  arr1(3, d(Cells(i, 2).Value)) = arr1(3, d(Cells(i, 2).Value)) + Cells(i, 5)
  arr1(4, d(Cells(i, 2).Value)) = arr1(4, d(Cells(i, 2).Value)) + Cells(i, 6)
Next
[a24].Resize(d.Count, 4) = Application.Transpose(d.Keys)
[b24].Resize(d.Count, 4) = Application.Transpose(arr1)
End Sub

以上两种写法中,如果从速度上来说,均可先将表中数据存入一数组,然后从数组中取数,而不是从表中取数还要快得多

[此贴子已经被作者于2008-1-21 14:32:10编辑过]
回复

使用道具 举报

发表于 2008-1-21 15:46 | 显示全部楼层

QUOTE:
以下是引用False在2008-1-21 9:01:00的发言:

d(Cells(I, 1).Value)   vs   d(Cells(I, 1))

Cells(I, 1)是一个对象,以一个单元格对象作为key,会产生意想不到的错误的;

而Cells(I, 1).Value是Cells(I, 1)对象的值,当然也可以用Cells(I, 1).text

cells(i,1).value 和 cells(i,1).text 在对于数字方面会有不同

cells(i,1).text 对数字处理方面,对于列宽和字体大小的变化会返回不同结果

回复

使用道具 举报

发表于 2008-1-21 16:56 | 显示全部楼层

cells(i,1).value是该单元格中的数值,列宽和字体大小的变化导致单元格中可见文本变化时,其值不变

cells(i,1).text 是该单元格中当前可见的文本,当列宽和字体大小的变化导致可见文本变化时,其值相应变化,否则是不变的

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 23:04 , Processed in 0.209590 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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