看了ldy版主的ttp://www.excelpx.com/dispbbs.asp?boardID=5&ID=27869&page=1贴子,努力学习一番,终于有点体会,特写出来,一是还有3个问题需寻求帮助,二是给象我这样的初学者一个分享: 表sheet1的2到100行中,A列为部门,5列为工资,目的是算出各部门的工资之和,写入cells(2,10)起的单元格中,使用字典方式:
方式一:VBE窗口---工具---引用---microsoft scripting runtime Sub test() Dim d As New Dictionary ‘创建字典 d.CompareMode = TextCompare ' 或= vbTextCompare For I = 2 To 100 d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5) ‘1、此处必须加.value,否则达不到目的,不清楚为什么。 ‘2、向字典d中添加项目,类似于d.add cells(I,1).value,cells(I,5) .value,但不同的在于:遇到重复的部门名时,则累加,而用后者会报错。 ‘3、也可写成d(Cells(I, 1).Value) =d(Cells(I, 1).Value)+ Cells(I,5) 。 ‘4、机理:设cells(2,1)与cells(10,1)都是“后勤”,工资分别为5000、4000,运行到cells(2,1)时,第二个d(Cells(I, 1).Value)(或d.Item(Cells(I, 1).Value))自动将当前的“后勤”写入当前的KEY,同时ITEM为空,+ Cells(I,5)后写入ITEM,使d(Cells(I, 1).Value) =d(Cells(I, 1).Value)+ Cells(I,5)的结果为d(Cells(I, 1).Value) =5000;运行到cells(10,1)时,由于前边已有“后勤”的key了,直接使d(Cells(I, 1).Value) =d(Cells(I, 1).Value)+ Cells(I,5)=5000+4000=9000。要注意的是KEY的写入,如原贴中的s=d(arr(i)),此处的s无实际作用,只起到个执行d(arr(i)),即将arr(i)写入KEY的目的。 ‘5、不要企图象数组一样按项写入,如想让字典d的第一个key为“aaaaa”就写成d(0)= “aaaaa”(这样写结果成了key为0,item为“aaaaa”)等等方式 Next For I = 0 To d.Count – 1 ‘写典项从0开始 Cells(I + 2, 10) = d.Keys(I) ‘按项引用,有点象对数组的引用; Cells(I + 2, 11) = d.Items(I) ‘对item的引用 ,也可以为Cells(I + 2, 11) = d (Cells(I + 2, 11).value),与前边一样,为什么一定要加上.value,否则不成功,也不明白。 Next End Sub
方式二:Set d = CreateObject("scripting.Dictionary") Sub test() Set d = CreateObject("scripting.Dictionary") d.CompareMode = vbTextCompare '此处必须加上VB两字,否则按默认的比较方式,这是与方式一不同之一 For I = 1 To 10 ‘与方式一相同,不再说 d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 2) Next arr = d.keys ‘不同之二,不能象方式一一样用Cells(I + 2, 10) = d.Keys(I) 按项引用key,我就只有将所有的KEY写入数组ARR了,这是为什么也不清楚。 For I = 0 To d.Count - 1 Cells(I + 2, 10) = arr(I) Cells(I + 2, 11) = d(arr(i)) Next End Sub 求教3个问题: 1、d.Item(Cells(I, 1).Value) = d.Item(Cells(I, 1).Value) + Cells(I, 5)为什么必须加.value? 2、方式二中d.CompareMode =VBTextCompare的VB为什么必须加,而方式一却可有可无 3、方式一中对i个key的引用可以用d.Keys(I),而方式二为什么不可以?
望各位不吝赐教!
|