Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3474|回复: 15

[已解决]字典有没有办法直接按求出的唯一代码汇总

[复制链接]
发表于 2008-12-3 22:36 | 显示全部楼层 |阅读模式

QnOzlZEy.rar (793.96 KB, 下载次数: 44)

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2008-12-3 23:58 | 显示全部楼层    本楼为最佳答案   

Sub zwgk_d2()
Dim d As Object, rng, i%, m%, arr
Set d = CreateObject("Scripting.Dictionary")
With Sheets(4)
rng = .Range(.[k1], .[m1].End(4))
End With
ReDim arr(1 To UBound(rng), 1 To 2)
For i = 1 To UBound(rng)
w = Left(rng(i, 3), 8)
If d(w) = "" Then
m = m + 1
d(w) = m
arr(m, 1) = rng(i, 1): arr(m, 2) = "'" & w & "0000"
Else
arr(d(w), 1) = arr(d(w), 1) + rng(i, 1)
End If
Next i
With Sheets(2)
.[a1].Resize(m, 2) = arr
End With
End Sub
回复

使用道具 举报

 楼主| 发表于 2008-12-4 08:22 | 显示全部楼层

非常感谢,汇总功能实现,但能否加上代码注释,便于学习

能否提取的同时排序

回复

使用道具 举报

发表于 2008-12-4 08:43 | 显示全部楼层

写入单元格后再排序才是最高效率的。

每句都很浅显且都是论场中常见的,哪句须要注释呢?

回复

使用道具 举报

 楼主| 发表于 2008-12-4 17:04 | 显示全部楼层

由于金额要放在 H 列,代码放在 K 列,所以我改成了这样,但我想在I列增加根据代码查询的一个项目,怎么改

Sub zwgk_d22()       Dim d As Object, rng, i%, m%, arr
Set d = CreateObject("Scripting.Dictionary")
With Sheets(4)
rng = .Range(.[k2], .[m2].End(4))
End With
ReDim arr(1 To UBound(rng), 1 To 4)
For i = 1 To UBound(rng)
w = Left(rng(i, 3), 8)
If d(w) = "" Then
m = m + 1
d(w) = m
arr(m, 1) = rng(i, 1): arr(m, 4) = "'" & w & "0000"
Else
arr(d(w), 1) = arr(d(w), 1) + rng(i, 1)
End If
Next i
With Sheets(2)
.[g2].Resize(m, 4) = arr
End With
End Sub

回复

使用道具 举报

 楼主| 发表于 2008-12-4 20:46 | 显示全部楼层

完全不懂代码,既然实现了功能,还是洗完昂注释一下(代码除外)

Sub zwgk_d22()        '请教得来,取分配表代码
Dim d As Object, rng, i%, m%, y%, arr '声明一个对象变量来存放该对象的引用。Dim as Object 采用后期绑定方式。
Set d = CreateObject("Scripting.Dictionary")
With Sheets(4)
rng = .Range(.[k2], .[m2].End(4))
End With
ReDim arr(1 To UBound(rng), 1 To 4)
For i = 1 To UBound(rng)
w = Left(rng(i, 3), 8)
If d(w) = "" Then
m = m + 1
d(w) = m
arr(m, 1) = rng(i, 1): arr(m, 2) = rng(i, 2): arr(m, 4) = "'" & w & "0000"
Else
arr(d(w), 1) = arr(d(w), 1) + rng(i, 1)
End If
Next i
With Sheets(2)
.[g2].Resize(m, 4) = arr
End With
End Sub

回复

使用道具 举报

 楼主| 发表于 2008-12-4 21:12 | 显示全部楼层

E列和J列数据一样,我这样改怎么其他行数据正确,J列却提取的第一个数据,而不是和E列一样是和,是完成后

让J列等于E列,还是怎么改?

Sub zwgk_d22()       

Dim d As Object, rng, i%, m%, y%, arr
Set d = CreateObject("Scripting.Dictionary")
With Sheets(4)
rng = .Range(.[k2], .[m2].End(4))
End With
ReDim arr(1 To UBound(rng), 1 To 6)
For i = 1 To UBound(rng)
w = Left(rng(i, 3), 8)
If d(w) = "" Then
m = m + 1
d(w) = m
 arr(m, 1) = rng(i, 1): arr(m, 2) = 0:  arr(m, 4) = rng(i, 2): arr(m, 6) = "'" & w & "0000"
Else
arr(d(w), 1) = arr(d(w), 1) + rng(i, 1)
End If
Next i
With Sheets(2)
.[e2].Resize(m, 6) = arr
End With
End Sub

回复

使用道具 举报

 楼主| 发表于 2008-12-4 21:25 | 显示全部楼层

我想通过实例学习VBA,请提供代码的同时加上注释
回复

使用道具 举报

发表于 2008-12-4 21:32 | 显示全部楼层

不晓得目的是啥。

If d(w) = "" Then
m = m + 1
d(w) = m
 arr(m, 1) = rng(i, 1): arr(m, 2) = 0:  arr(m, 4) = rng(i, 2): arr(m, 6) = "'" & w & "0000"
Else
arr(d(w), 1) = arr(d(w), 1) + rng(i, 1)
End If
的作用是第一次出现的值w,则将相应的rng值写入数组arr成为一条新的记录;对于重复出现的值w,则将rng的值累加到数组arr上(只累加到了相应arr记录的第一列上,其它值则不变)

[此贴子已经被作者于2008-12-4 21:33:58编辑过]
回复

使用道具 举报

 楼主| 发表于 2008-12-4 21:45 | 显示全部楼层

如果累加其他列,怎么办呢?

同时有几列需要累加怎么办呢?

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 19:42 , Processed in 0.286502 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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