[转载]EXCEL VBA自定义排序的三种方法
什么是用户定义的排序意味着按照指定的顺序对数据源进行排序。
分享了三种方法:
第一种方法是系统自带的OrderCustom。它的优点是代码简洁,但缺点是自定义序列有字符长度限制(255个字符)。
第二种方法是字典数组设置序号,然后用辅助列排序。优点是不会破坏细胞的形态和结构,比如公式、背景等等。
第三种方法是只使用字典数组和简单的桶排序技术直接对数组中的数据进行排序。优点是效率高,缺点是会破坏细胞结构,比如消除公式。
(第一个建议是掌握,第二个建议是理解,第三个.能看懂就看懂,看不懂就留在那里~)
比如说。
如下图所示,A:C列为数据源。
现在需要按照e列中指定的部门顺序对数据源进行重新排序,如果部门不在指定的顺序中,就会放在数据源的末尾。
子自定义排序1()
Eh技术论坛VBA编程学习与实践看星光
调光范围
设置rng=范围(' e2:e '单元格(行。数数,‘e’)。结束(xlUp)。行)
申请。添加自定义列表(rng)
添加自定义序列,它不仅支持单元格对象,还支持数组。
n=应用。自定义列表计数
自定义序列的数量
范围(' a:c ')。Sort key1:=[a1],order 1:=Xl升序,HEADER:=xlYes,ordercustom:=n 1
使用自定义排序,ordercustom指定使用哪个自定义序列排序。
使用自定义排序时,需要将OrderCustom参数设置为自定义列表中指定序列的顺序加1。
申请。删除自定义列表n
删除新添加的自定义序列
末端接头
子自定义排序2()
作为对象,r,I,arr,brr
set d=CreateObject(' ing . dictionary ')
r=范围(' e2:e '单元格(行。数数,‘e’)。结束(xlUp)。行)。价值
对于i=1至Ubund(r)
D(r(i,1))=i '目标序列循环加载到字典中,以序列号为项目。
然后
arr=范围(' a2:c '单元格(行。计数,1)。结束(xlUp)。行)
数据源加载数组arr
ReDim brr(1到UBound(arr),1到1)
按照指定的顺序声明数组brr原始部门的序列号。
对于i=1至UBound(arr)
如果d存在(arr(i,1)),那么
Brr(i,1)=d(arr(i,1))‘将指定序列中原始部门的序列号装入Brr。
其他
Brr(i,1)=“指定的序列不存在”
如果…就会结束
然后
[d:d]。插入
在d列中插入一列。
[d2]。调整大小(UBound(brr),1)=brr
新的序列号放在d列。
范围(' a:d ')。Sortkey1:=[D1],Order1:=XLAscending,Header3360=XLYES按升序进行列排序。
[d:d]。删除'删除列d
设置d=无
末端接头
子自定义排序3()
Eh科技论坛微信官方账号VBA编程学习与实践看星光
作为对象,I,n,x,k,j
Dim r,arr,brr,crr
set d=CreateObject(' ing . dictionary ')
晚装词典
r=范围(' e2:e '单元格(行。数数,‘e’)。结束(xlUp)。行)。价值
对于i=1至Ubund(r)
D(r(i,1))=i '目标序列循环加载到字典中,以序列号为项目。
然后
arr=范围(' a2:c '单元格(行。计数,1)。结束(xlUp)。行)
数据源加载数组
1到d计数1,1到1
Brr数组用于根据序列号加载数组arr的行号,类似于桶排序桶。
对于i=1至UBound(arr)
如果d存在(arr(i,1)),那么
如果字典里有相关的部门.
n=d(arr(i,1))
指定序列中部门的序列号。
brr(n,1)=brr(n,1)',' I
将arr中部门的行号加载到对应于阵列brr的序列号行中。
其他
brr(UBound(brr),1)=brr(UBound(brr),1)',' I
如果字典中不存在,请将其放在数组brr的最后一行。
如果…就会结束
然后
雷迪姆crr(1至UBound(arr),1至UBound(arr,2))
数组crr放置排序的结果。
对于i=1至UBound(brr)
如果brr(i,1)' '那么
如果不为空,则有符合指定排序标准的关键字。
r=拆分(brr(i,1),',')
取出存储在brr这个位置的行号。
对于x=1至Ubund(r)
k=k ^ 1 '累计行
对于j=1至UBound(arr,2)
crr(k,j)=arr(r(x),j)
遍历指定行位置的数组arr的值移动到crr。
然后
然后
如果…就会结束
然后
范围(' a2:c '单元格(行。计数,1)。结束(xlUp)。行)=crr
将数组crr的排序结果放回单元格区域。
“Set=nothing”释放字典
擦除arr:擦除brr:擦除crr
'释放数组'
末端接头
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/88685.html