|
楼主 |
发表于 2014-9-26 00:22
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
在下面帖子的27楼中,我使用了中级字典用法:【字典记录用作索引】
http://club.excelhome.net/forum. ... 387&pid=7868650
题目要求:
A列中的数值,统计相同值的个数,并按从小到大顺序分列输出。- Sub test9() '27L kagawa-1
- Dim ar, br, cr, dic, i&, j&, k&, m&, n&, s
-
- ar = [a1].CurrentRegion
- ReDim br(2, UBound(ar))
-
- Set dic = CreateObject("Scripting.Dictionary")
- For i = 1 To UBound(ar)
- s = ar(i, 1) 'A列值s、作为字典关键字key
- j = dic(s) '字典返回其索引值j
- If j = 0 Then '如 j =0 则字典中该key为空 即s尚未存入字典
- k = k + 1: dic(s) = k: j = k '于是新增索引值k+1 并作为s的索引值存入字典
- '下面是比较插入排序
- For m = 1 To k - 1
- If br(2, m) > s Then '检查到比当前值更大位置时
- For n = k To m + 1 Step -1 '倒序移动更大的值
- br(2, n) = br(2, n - 1)
- br(1, n) = br(1, n - 1)
- Next
- Exit For '腾出新位置后退出
- End If
- Next
- br(2, m) = s: br(1, m) = k '在新位置插入新值
- End If
- br(0, j) = br(0, j) + 1 '在数组br中统计关键字s对应的个数
- ' 【直接使用字典做统计时,一般是 dic(s) = dic(s) + 1 即可】 但注意字典需要多引用一次。所以速度效率略低。
- Next
-
- [c1].CurrentRegion = ""
- For j = 1 To k
- Cells(1, 2 + j).Resize(br(0, br(1, j))) = br(2, j)
- Next
- End Sub
复制代码 本例虽然使用了字典,但并不用足……
仅仅把字典用作对关键字进行位置索引的关联,
而把统计个数等其它的处理,仍然交给数组去完成。
因为数组的速度效率是最高的。
呵呵。虽然代码复杂了一点,但思路值得学习。
|
评分
-
1
查看全部评分
-
|