HOWTO · VBA

在 VBA 中对数组和 Arraylist 的元素进行排序

本教程演示如何在 VBA 中对数组和 ArrayList 的元素进行排序。

本页内容

在 VBA 或任何编程语言中,计算机需要存储对代码执行至关重要的值。一个很好的方法是利用数组。

数组是具有存储信息能力的对象。它们在计算机编程中必不可少,因为它们使程序员可以选择保存代码执行后期所需的数据。

在 VBA 中,我们可以利用 Array() 和 Arraylist() 来满足我们的数组需求。前者的执行时间更快,而后者保证了灵活性。前者是固定长度,而后者是可变长度。

下面的代码块将演示如何创建和使用 Array() 和 Arraylist()。

创建和使用静态 Array():

Sub StatArrayDemo()

Dim namesArr (1 to 4) as String

namesArr(1) = "Glen"
namesArr(2) = "Jose"
namesArr(3) = "Katrina"
namesArr(4) = "Myla"

Debug.print namesArr(3)
End Sub

StatArrayDemo 输出:

Katrina

创建和使用动态 Array():

Sub DynaArrayDemo()

Dim namesArr as Variant

namesArr = Array("Glen", "Jose", "Katrina", "Myla")

Debug.print namesArr(0)
End Sub

DynaArrayDemo 输出:

Glen

创建和使用 Arraylist()

要在 VBA 中使用 Arraylist(),我们需要启用 Arraylist() 所在的库。

去做这个:

  • 打开 Excel 文件。
  • 从开发人员选项卡中,打开 Visual Basic 编辑器。
  • 从工具工具栏中,单击参考。
  • 勾选 mscorlib.dll 复选框。

现在一切就绪。

在下面的示例中,声明并初始化名为 ArrayValues 的 Arraylist 对象,然后添加值。

Sub ArrayListDemo()

Dim ArrayValues As ArrayList
'Create a new Arraylist Object

'Adding Values to ArrayValues Arraylist
ArrayValues. Add("Glen")
ArrayValues. Add("Jose")
ArrayValues. Add("Kartina")
ArrayValues. Add("Myla")

Debug.Print (ArrayValues(1))

End Sub

ArrayListDemo 输出:

Jose

在 VBA 中对 Array() 进行排序

下面的代码块将按数字顺序或字母顺序对子程序中输入的值进行排序。

ArraySort 子程序接受三个参数。vArray 其中未排序的值,而 inLow 将是 vArray 的下限,而 inHi 是 vArray 的上限。ArraySort 由两个测试子程序 NumberTest 和 LetterTest 测试。

Public Sub ArraySort(vArray As Variant, inLow As Long, inHi As Long)

Dim arr1   As Variant
Dim tempO As Variant
Dim tempL  As Long
Dim tempH   As Long

tempL = inLow
tempH = inHi

arr1 = vArray((inLow + inHi) \ 2)

While (tempL <= tempH)
    While (vArray(tempL) < arr1 And tempL < inHi)
        tempL = tempL + 1
    Wend

    While  (arr1 < vArray(tempH) And tempH > inLow)
        tempH = tempH - 1
    Wend

    If (tempL <= tempH) Then
        tempO = vArray(tempL)
        vArray(tempL) = vArray(tempH)
        vArray(tempH) = tempO
        tempL = tempL + 1
        tempH = tempH - 1
    End If
Wend

If (inLow < tempH) Then ArraySort vArray, inLow, tempH
If (tempL < inHi) Then ArraySort vArray, tempL, inHi

End Sub

Sub NumberTest()

Dim myArr As Variant

myArr = Array(5, 7, 3, 8, 5, 3, 4, 1)

Call ArraySort(myArr, 0, UBound(myArr))

Dim i As Integer

For i = LBound(myArr) To UBound(myArr)

Debug.Print (myArr(i))
Next i

End Sub

Sub LetterTest()

Dim myArr As Variant


myArr = Array("A", "T", "O", "D", "B", "Q", "M", "L")
Call ArraySort(myArr, 0, UBound(myArr))

Dim i As Integer

For i = LBound(myArr) To UBound(myArr)

Debug.Print (myArr(i))
Next i

End Sub

NumberTest 输出:

1 
3 
3 
4 
5 
5 
7 
8 

LetterTest 输出:

A
B
D
L
M
O
Q
T

在 VBA 中对 Arraylist() 进行排序

对于 Arraylist,它更容易,因为 Arraylist 对象带有 Sort 方法。因此,如果你需要对数组中的内容进行排序,最好使用 Arraylist。

下面的代码块将演示如何对 Arraylist 中的值进行排序。Arraylist 的 Sort 功能可以对值和字母进行排序。

Public Sub ArraylistSortLetters()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add ("A")
myArr.Add ("T")
myArr.Add ("O")
myArr.Add ("D")
myArr.Add ("B")
myArr.Add ("Q")
myArr.Add ("M")
myArr.Add ("L")

myArr.Sort

Dim i As Integer

For i = 0 To myArr.Count - 1
   Debug.Print (myArr(i))
Next i

End Sub

ArraylistSortLetters 输出:

A
B
D
L
M
O
Q
T
Public Sub ArraylistSortNumbers()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add (5)
myArr.Add (8)
myArr.Add (2)
myArr.Add (8)
myArr.Add (4)
myArr.Add (7)
myArr.Add (1)
myArr.Add (7)

myArr.Sort

Dim i As Integer

For i = 0 To myArr.Count - 1
    Debug.Print (myArr(i))
Next i

End Sub

ArraylistSortNumbers 输出:

1 
2 
4 
5 
7 
7 
8 
8 

ArraylistSortLetters 和 ArraylistSortNumbers 上面的两个代码块将元素从低到高排序。

如果我们想将数组从高到低排序,我们可以将数组从低到高排序,然后使用 Reverse 方法进行切换。

下面的代码块将演示使用 Reverse 方法从高到低排序。

Public Sub SortInHighestToLowest()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add (5)
myArr.Add (8)
myArr.Add (2)
myArr.Add (8)
myArr.Add (4)
myArr.Add (7)
myArr.Add (1)
myArr.Add (7)

myArr.Sort
myArr.Reverse

Dim i As Integer

For i = 0 To myArr.Count - 1
   Debug.Print (myArr(i))
Next i

End Sub

SortInHighestToLowest 输出:

8 
8 
7 
7 
5 
4 
2 
1