Excel VBA 數組排序
作者: parno
使用EXCEL的VBA編程時,經常會用到數組,有時需要對數組進行排序,在這里介紹一下數字數組排序的常用方法以及帶有EXCEL特色的函數排序方法(所舉例子均以升序排列數組)。
在介紹具體方法之前,先給個數組生成過程。(將數組a(1 to 50)定義成公用數組)
復制內容到剪貼板 程序代碼
Sub MakeArr()
For i = 1 To 50
a(i) = Int(Rnd(1) * 890 + 10)
Next i
End Sub
1、快速排序法
復制內容到剪貼板 程序代碼
Sub FastSort()
M = 1
For i = 1 To 49
If a(i) <= a(i + 1) Then
If i > M Then
M = i
Else
i = M
End If
GoTo kk:
Else
x = a(i)
a(i) = a(i + 1)
a(i + 1) = x
If i <> 1 Then i = i - 2
End If
kk:
Next i
End Sub
2、冒泡排序法
復制內容到剪貼板 程序代碼
Sub BubbleSort()
For i = 1 To 49
For j = i + 1 To 50
If a(i) > a(j) Then
TEMP = a(j)
a(j) = a(i)
a(i) = TEMP
End If
Next j
Next i
End Sub
3、桶排序法
復制內容到剪貼板 程序代碼
Sub Bucket()
Dim Index
Dim tempnum
For i = 2 To 50
tempnum = a(i)
Index = i
Do
If Index > 1 Then
If tempnum < a(Index - 1) Then
a(Index) = a(Index - 1)
Index = Index - 1
Else
Exit Do
End If
Else
Exit Do
End If
Loop
a(Index) = tempnum
Next
End Sub
4、希爾排序法
復制內容到剪貼板 程序代碼
Sub ShellSort()
Dim skipnum
Dim Index
Dim i
Dim tempnum
Size = 50
skipnum = Int((Size / 2)) - 1
Do While skipnum > 0
i = 1 + skipnum
For j = i To 50
Index = j
Do
If Index >= (1 + skipnum) Then
If a(Index) < a(Index - skipnum) Then
tempnum = a(Index)
a(Index) = a(Index - skipnum)
a(Index - skipnum) = tempnum
Index = Index - skipnum
Else
Exit Do
End If
Else
Exit Do
End If
Loop
Next
skipnum = (skipnum - 1) / 2
Loop
End Sub
5、選擇排序法
復制內容到剪貼板 程序代碼
Sub SelectionSort()
Dim Index
Dim Min
Dim i
Dim tempnum
BzArr
i = 1
While (i < 50)
Min = 50
Index = Min - 1
While (Index >= i)
If a(Index) < a(Min) Then
Min = Index
End If
Index = Index - 1
Wend
tempnum = a(Min)
a(Min) = a(i)
a(i) = tempnum
i = i + 1
Wend
End Sub
以上五種排序方法均是數組排序的常用方法,優(yōu)點是不需借助輔助單元格。執(zhí)行效率視數組成員的相對有序性的不同而不同。以附件中的50位一維數組為例,快速排序法的循環(huán)次數是745次、冒泡法的循環(huán)次數是1225次、桶排序法的循環(huán)次數是704次、希爾排序法的循環(huán)次數是347次、選擇排序法的循環(huán)次數為1225次。
下面再介紹兩種用EXCEL函數的排序方法,一般來說使用EXCEL自帶函數或方法的執(zhí)行效率會高一些,但限于函數參數的限制有的不得不借助于輔助單元格。
6、SMALL函數法
復制內容到剪貼板 程序代碼
Sub SmallSort()
Dim b(1 To 50)
For i = 1 To 50
b(i) = Application.WorksheetFunction.Small(a, i)
Next
End Sub
原數組不變,生成一個新的按升序排列的數組。
同理也可以用LARGE函數。我個人覺得用這種方法較快。
7、RANK函數法
復制內容到剪貼板 程序代碼
Sub RankSort()
BzArr
Dim b(1 To 50)
For i = 1 To 50
Sheet2.Cells(i, 1) = a(i)
Next
Set rankrange = Sheet2.Range("a1:a50")
For i = 1 To 50
For k = 0 To Application.WorksheetFunction.CountIf(rankrange, Sheet2.Cells(i, 1)) - 1
j = Application.WorksheetFunction.Rank(Sheet2.Cells(i, 1), rankrange, 1)
a(j + k) = Sheet2.Cells(i, 1)
Next
Next
For i = 1 To 50
Sheet1.Cells(i + 2, 7) = a(i)
Next
End Sub
此方法的缺點是需要借助輔助單元格。當然如果借助輔助單元格的話完全可以用EXCEL的排序功能,在這里就沒必要詳述了。