在 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