|
本帖最后由 香川群子 于 2015-12-7 19:38 编辑
一般说,由Excel中的单元格区域数据对象构成的二维数组,可以直接使用工作表排序方法。
不仅速度快,而且无需读入、写出操作。
但是,默认工作表排序方法一次只能使用3个key、所以如果有较多key需要排序时,
可以使用VBA循环代码,一次排1列,逆序循环排序后得到结果。
【注意必须逆序操作,即、权重最小的列第1个排序,而权重最大的列必须最后一个排序。】
这个和我们通常的习惯是相反的,需要注意。
示例代码如下:
- Sub test1()
- Dim ar, sr, sr2, i&, j&, tms#
- '假设待排序原始数据是在A1开始的多行、7列区域中
- sr = Array(1, 3, 5, 7) '需要排序的列的权重顺序
- sr2 = Array(1, 2, 2, 1) '需要排序的列的升降顺序(1为升序、2为降序)
-
- Application.ScreenUpdating = False '禁止刷屏
- For j = UBound(sr) To 0 Step -1 '逆序循环
- [a1].Sort [a1].Offset(, sr(j) - 1), sr2(j) '每次排序1列
- Next
- Application.ScreenUpdating = True
-
- End Sub
复制代码
这样已经很好了。
但是,如果是VBA过程中生成的VBA内存二维数组需要排序,
那么用工作表排序方法就比较麻烦,需要先把二维数组写入工作表,然后排序,然后再读入VBA……
另外,如果是超过65536行甚至几十万、几百万的数据需要排序,
那工作表方法就不能用了,读写数据就需大量时间。
因此,虽然不是很常用,但还是需要一种直接对VBA内存数组进行排序的算法。
VBA排序算法有很多,但基本上都是一维数组排序。
即使简单改写一下能用于二维数组,但对于稳定的多key排序,就无法解决。
因为,稳定排序的冒泡算法速度非常之慢,而速度较快的快速排序是不稳定排序算法,
所以多key排序的结果就会出错。
有鉴于此,我在高手提示下,用简单的VBA代码补充完善了QuickSort算法的稳定排序方法,
因此,已经可以进行二维数组的多key稳定排序了。
代码如附件。
2015/12/7彻底更新附件。
二维数组多key稳定排序 Multi-Key Stable Sort_kagawa.rar
(22.25 KB, 下载次数: 1553)
附件更新、加入了必要的注释、以及参数的概略说明。
同时,写了2个test示例代码,分别说明对工作表区域读入二维数组以后的多key稳定排序,
以及直接对VBA内存二维数组进行多key稳定排序的使用方法。
我原创的算法虽然结果是正确的,但速度效率很低。
【因为简单模仿工作表超过3key的多key排序时、需采取倒序排序的方法,因此误入歧途,效率很低】
所以,现在的代码,已经是按照Zamyi大侠的基本算法进行。(仅仅增加了最后的稳定性排序、以及空值移动到最后的算法)
在此深表敬意。(抄袭代码就是致敬!呵呵。)
2015/12/7
|
评分
-
11
查看全部评分
-
|