在 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