Excel VBA排序技巧大揭秘!
创作时间:
作者:
@小白创作中心
Excel VBA排序技巧大揭秘!
引用
CSDN
等
15
来源
1.
https://blog.csdn.net/Eternal_Whispers/article/details/127408919
2.
https://blog.csdn.net/weixin_38109688/article/details/87655999
3.
https://blog.csdn.net/perfect_red/article/details/110944144
4.
https://blog.csdn.net/zhangdabai1/article/details/135302369
5.
https://blog.csdn.net/aaron19822007/article/details/124647770
6.
https://blog.csdn.net/VBAxiaoxueshen/article/details/123496924
7.
https://jingyan.baidu.com/article/9f63fb91deaa8a89400f0e89.html
8.
https://www.excelhome.net/445.html
9.
https://www.cnblogs.com/eyunkeji/p/16900871.html
10.
https://trumpexcel.com/sort-data-vba/
11.
https://www.cnblogs.com/karkash/p/11982414.html
12.
https://officeguide.cc/excel-vba-array-quick-sort-function-tutorial-examples/
13.
https://www.kdocs.cn/article/A7FFC3E928.html
14.
https://www.cnblogs.com/reakal/p/15548999.html
15.
https://www.cnblogs.com/medik/p/11026422.html
在处理大量数据时,Excel VBA排序功能无疑是提高工作效率的好帮手。无论是随机排序还是自定义顺序快速排序,VBA都能帮你轻松搞定。通过简单的代码示例,你将学会如何利用VBA实现各种复杂的排序需求,让你的数据管理更加高效便捷。快来一起探索这些实用技巧吧!
01
VBA排序基础:Sort函数详解
Excel VBA提供了强大的Sort函数,可以方便地对工作表内容进行排序。Sort函数的基本语法如下:
Range("待排序数据区域").Sort Key1, Order1, Key2, Type, Order2, Key3, Order3,
Header, OrderCustom, MatchCase, Orientation, SortMethod,
DataOption1, DataOption2, DataOption3
各参数的意义如下:
- Key1、Key2、Key3:排序的关键列(或行)的单元格地址,如Range("A1")。一次Sort最多只能调用3个参数,至少使用1个参数即可。
- Order1、Order2、Order3:排序的顺序模式指定参数。即:A-Z升序= xlAscending 或直接=1,Z-A降序= xlDescending 或直接=2。
- Header:是否有标题行参数,一共有3个值:Header:= xlGuess=0 或xlYes=1 或 xlNo=2。
- MatchCase:是否匹配大小写。MatchCase:=False 、或=0 不区分大小写,MatchCase:=True 、或=1 区分大小写(Case Sensitive)。
- Orientation:排序方向。一般为同一列中从上到下各行进行排序:Orientation:= xlTopToBottom 、或=1。如果是: 同一行中从左到右各列进行排序,则为:Orientation:= xlLeftToRight、或=2。
- SortMethod:排序方法。按拼音排序: SortMethod:= xlPinYin 、或=1 (Use phonetic info),按笔画排序: SortMethod:= xlStroke、或=2。
下面是一个简单的示例,演示如何使用Sort函数对工作表进行排序:
Sub SortExample()
Dim ws As Worksheet
Set ws = ActiveWorkbook.Sheets("Sheet1")
' 获取当前表最大行数
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 对A列进行升序排序
ws.Range("A1:C" & lastRow).Sort Key1:=ws.Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub
02
常用排序算法实现
除了使用内置的Sort函数,我们还可以通过VBA实现各种经典的排序算法。这里介绍两种常用的排序算法:冒泡排序和快速排序。
冒泡排序
冒泡排序是一种简单的排序算法,通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
Sub BubbleSort(MyArray() As Variant, ByVal nOrder As Integer)
Dim i As Long, j As Long
Dim temp As Variant
For i = LBound(MyArray) To UBound(MyArray) - 1
For j = i + 1 To UBound(MyArray)
If (nOrder = 0 And MyArray(i) > MyArray(j)) Or (nOrder = 1 And MyArray(i) < MyArray(j)) Then
temp = MyArray(i)
MyArray(i) = MyArray(j)
MyArray(j) = temp
End If
Next j
Next i
End Sub
快速排序
快速排序是一种高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。
Sub QuickSort(arr() As Variant, low As Long, high As Long)
Dim pivot As Variant
Dim i As Long, j As Long
Dim temp As Variant
If low < high Then
pivot = arr(low)
i = low
j = high
Do While i < j
Do While arr(j) >= pivot And i < j
j = j - 1
Loop
Do While arr(i) <= pivot And i < j
i = i + 1
Loop
If i < j Then
temp = arr(i)
arr(i) = arr(j)
arr(j) = temp
End If
Loop
arr(low) = arr(i)
arr(i) = pivot
QuickSort arr, low, i - 1
QuickSort arr, i + 1, high
End If
End Sub
03
随机排序技巧
随机排序在实际工作中有很多应用场景,比如随机安排考试座位、随机分配工作任务等。下面是一个使用Fisher-Yates算法实现的随机排序示例:
Sub ShuffleArray(arr As Variant)
Dim i As Long, j As Long
Dim temp As Variant
Randomize
For i = UBound(arr) To LBound(arr) + 1 Step -1
j = Int((i - LBound(arr) + 1) * Rnd) + LBound(arr)
temp = arr(j)
arr(j) = arr(i)
arr(i) = temp
Next i
End Sub
04
自定义排序方法
自定义排序允许我们按照特定的顺序对数据进行排序,而不是简单的升序或降序。以下是三种实现自定义排序的方法:
方法1:使用系统自带的OrderCustom
这种方法代码简洁,但自定义序列有字符长度限制(255个)。
Sub CustomSort1()
Dim rng As Range
Set rng = Range("E2:E" & Cells(Rows.Count, "E").End(xlUp).Row)
Application.AddCustomList rng
Dim n As Long
n = Application.CustomListCount
Range("A:C").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=n + 1
Application.DeleteCustomList n
End Sub
方法2:使用字典+数组+辅助列
这种方法不会破坏单元格的结构,如公式、背景等。
Sub CustomSort2()
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
Dim r As Variant
r = Range("E2:E" & Cells(Rows.Count, "E").End(xlUp).Row).Value
Dim i As Long
For i = 1 To UBound(r)
d(r(i, 1)) = i
Next i
Dim arr As Variant
arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
Dim brr() As Variant
ReDim brr(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
If d.exists(arr(i, 1)) Then
brr(i, 1) = d(arr(i, 1))
Else
brr(i, 1) = "指定序列不存在"
End If
Next i
[D:D].Insert
[D2].Resize(UBound(brr), 1) = brr
Range("A:D").Sort Key1:=[D1], Order1:=xlAscending, Header:=xlYes
[D:D].Delete
End Sub
方法3:使用字典+数组+桶排序
这种方法效率最高,但会破坏单元格的结构,如消除公式等。
Sub CustomSort3()
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
Dim r As Variant
r = Range("E2:E" & Cells(Rows.Count, "E").End(xlUp).Row).Value
Dim i As Long
For i = 1 To UBound(r)
d(r(i, 1)) = i
Next i
Dim arr As Variant
arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
Dim brr() As Variant
ReDim brr(1 To d.Count + 1, 1 To 1)
For i = 1 To UBound(arr)
If d.exists(arr(i, 1)) Then
Dim n As Long
n = d(arr(i, 1))
brr(n, 1) = brr(n, 1) & "," & i
End If
Next i
Dim crr() As Variant
ReDim crr(1 To UBound(arr), 1 To UBound(arr, 2))
Dim j As Long, k As Long
For i = 1 To UBound(brr)
If brr(i, 1) <> "" Then
j = j + 1
k = 1
Dim rowIndices As Variant
rowIndices = Split(brr(i, 1), ",")
For Each idx In rowIndices
crr(j, k) = arr(CLng(idx), k)
k = k + 1
Next idx
End If
Next i
Range("A2:C" & UBound(crr) + 1) = crr
End Sub
通过以上介绍,相信你已经掌握了VBA中各种排序技巧的实现方法。在实际工作中,你可以根据具体需求选择合适的排序算法和方法,提高数据处理效率。建议初学者先从内置的Sort函数开始学习,逐步掌握各种排序算法的实现原理。
热门推荐
债券凸性是什么?债券凸性对债券投资有什么影响?
供需对黄金价格的影响
细节描写包括哪些描写?细节描写的几种常见方式
基于活动的成本核算 – 理解作业成本计算以更好地进行财务管理
何以中国·运载千秋|走进古末口遗址,见证淮安两宋繁华
2025太极拳文化传承思考
助力孩子开启新学期,这份家长必备锦囊请收好→
管理情绪:理性情绪处理法与内在信念的调整
播音主持专业就业方向与就业前景分析 好不好找工作
红色江岸 七十潮涌 中国联通与中国一重携手绘就“智造”新蓝图
如何识别孩子的厌学情绪及应对策略?
跨省领证可以查出已经结婚么 领证会查婚姻状况吗
八字假化气格的原则
从布局到灯光,教你玩转客厅餐厅一体化
雪纳瑞犬的价格:不只是金钱的考量
如何优化房屋的功能分区?这种分区怎样满足多样化需求?
赛“马”开始!特斯拉FSD来袭,将如何影响中国自动驾驶行业
口服补液盐散Ⅲ能兑奶粉一起喝吗
器械集采:头部企业获益,小企业如何求存?
定格飞鸟精彩瞬间,器材很关键
揭秘真相,悬疑推理小说为何火爆?
教你如何组装高性价比的台式电脑
不是太极拳不能实战,而是你接触的根本不是真正的太极拳
曼城工资最高的球员排名!这几名球员的引援堪称成功
家用路由器选购指南:根据预算选择最适合的产品
炒土豆丝焯水和不焯水的区别?两种做法口感天差地别
如何通过财务报表分析识别潜在的投资机会?
深度学习相位恢复
探秘兰花之美(了解兰花的种类和特点,分享兰花赏析和养护技巧)
这些刀具保养的常见问题,你踩坑了吗?