VBA學習筆記2-數據結構類型ArrayList
一、這個東西是幹什麼的
在VBA裏數組的排序是很讓人頭痛的事情,一般採用冒泡,選擇,快速,插入,希爾等算法來對數組進行排序
- 冒泡,選擇,插入排序等因爲循環次數太多,效率感人
- 快速排序,因爲條件苛刻,要求整數,並且最大和最小相差太大,速度也會很慢
- 希爾排序,算法真心它能看明白我,我看不明白它
有沒有一種又簡單,又好用的對數組進行排序的
答案是有,知道的就有2個現成的對象,可以調用,今天我們來學習其中一個ArrayList對象
二、創建ArrayList
1,前期綁定
單擊“工具——引用”,在“引用”對話框中,找到並選中mscorlib.dll
前的複選框
Dim arrlist As New arraylist
2,後期綁定
Sub lizi2()
Dim arrList As Object
Set arrList = CreateObject("System.Collections.ArrayList")
Set arrList = Nothing
End Sub
三、常用方法和屬性
1,添加
- Add方法,arrList.Add item
itme 可以是數字,字符串,對象等變量,但是如果排序數據類型儘量統一,經過測試數字和文本比較會出錯,用這方法的時候,都用數字好了
Sub lizi2()
Dim arrList As Object
Set arrList = CreateObject("System.Collections.ArrayList")
arrList.Add 1
arrList.Add 11
arrList.Add 5
arrList.Add 6
arrList.Add 9
Set arrList = Nothing
End Sub
- Insert方法在特定位置插入數據
Sub lizi2()
Dim arrList As Object, i As Long
Set arrList = CreateObject("System.Collections.ArrayList")
arrList.Add 1
arrList.Add 11
arrList.Add 5
arrList.Add 6
arrList.Add 9
arrList.Insert 0, 10
For i = 0 To arrList.count - 1
Debug.Print i & ":" & arrList(i)
Next
Set arrList = Nothing
End Sub
顯示結果
0:10
1:1
2:11
3:5
4:6
5:9
2,判斷集合大小
- ArrayList.Count,來判斷,是從0開始到ArrayList.Count-1的,循環的時候注意
For i = 0 To arrList.count - 1
Debug.Print i & ":" & arrList(i)
Next
3,重點來了排序的辦法
3.1,升序排序
ArrayList.sort
3.2,降序排序
ArrayList.sort
ArrayList.Reverse
先排序,後面接一句這個就可以降序排序
Sub lizi2()
Dim arrList As Object, i As Long
Set arrList = CreateObject("System.Collections.ArrayList")
arrList.Add 1
arrList.Add 11
arrList.Add 5
arrList.Add 6
arrList.Add 9
arrList.Insert 0, 10
arrList.Sort
For i = 0 To arrList.count - 1
Debug.Print i & ":" & arrList(i)
Next
Set arrList = Nothing
End Sub
顯示結果
0:1
1:5
2:6
3:9
4:10
5:11
降序
Sub lizi2()
Dim arrList As Object, i As Long
Set arrList = CreateObject("System.Collections.ArrayList")
arrList.Add 1
arrList.Add 11
arrList.Add 5
arrList.Add 6
arrList.Add 9
arrList.Insert 0, 10
arrList.Sort '先排序,這時候是升序
arrList.Reverse '再來一句相反的,變降序了
For i = 0 To arrList.count - 1
Debug.Print i & ":" & arrList(i)
Next
Set arrList = Nothing
End Sub
顯示結果
0:11
1:10
2:9
3:6
4:5
5:1
速度又快,有簡單
4,複製集合的方法
- Clone方法
Sub lizi2()
Dim arrList As Object, i As Long
Dim arrList2 As Object, brr()
Set arrList = CreateObject("System.Collections.ArrayList")
Set arrList2 = CreateObject("System.Collections.ArrayList")
arrList.Add 1: arrList.Add 11: arrList.Add 9
arrList.Add 5: arrList.Add 6: arrList.Insert 0, 10
Set arrList2 = arrList.Clone '把沒排序之前的集合複製一個新的
arrList.Sort
arrList.Reverse
ReDim brr(1 To arrList.count + 1, 1 To 1)
For i = 0 To arrList.count - 1
brr(i + 1, 1) = arrList(i)
Next
Range("a1").Resize(arrList.count + 1, 1).Value = brr
ReDim brr(1 To arrList.count + 1, 1 To 1)
For i = 0 To arrList2.count - 1
brr(i + 1, 1) = arrList2(i)
Next
Range("b1").Resize(arrList.count + 1, 1).Value = brr
Set arrList = Nothing: Set arrList2 = Nothing
End Sub
結果
5,刪除辦法
- ArrayList.Clear
直接全部幹掉了 - ArrayList.Remove item
item必須是添加進去的內容,不支持索引這裏
Sub lizi2()
Dim arrList As Object, i As Long
Dim arrList2 As Object, brr()
Set arrList = CreateObject("System.Collections.ArrayList")
Set arrList2 = CreateObject("System.Collections.ArrayList")
arrList.Add 1: arrList.Add 11: arrList.Add 9
arrList.Add 5: arrList.Add 6: arrList.Insert 0, 10
Set arrList2 = arrList.Clone
arrList.Remove 11 '刪除item是11的內容
arrList.Sort
arrList.Reverse '降序
'下面內容全部是返回單元格
ReDim brr(1 To arrList.count + 1, 1 To 1)
For i = 0 To arrList.count - 1
brr(i + 1, 1) = arrList(i)
Next
Range("a1").Resize(arrList.count + 1, 1).Value = brr
ReDim brr(1 To arrList.count + 1, 1 To 1)
For i = 0 To arrList2.count - 1
brr(i + 1, 1) = arrList2(i)
Next
Range("b1").Resize(arrList.count + 1, 1).Value = brr
Set arrList = Nothing: Set arrList2 = Nothing
End Sub
顯示結果
6,可以直接複製成一個數組
- ToArray方法
Sub lizi2()
Dim arrList As Object, i As Long
Dim arrList2 As Object, brr()
Set arrList = CreateObject("System.Collections.ArrayList")
arrList.Add 1: arrList.Add 11: arrList.Add 9
arrList.Add 5: arrList.Add 6: arrList.Insert 0, 10
brr = arrList.toarray '從0開始的一維數組
Range("a1").Resize(UBound(brr) + 1, 1).Value = _
Application.WorksheetFunction.Transpose(brr)
Set arrList = Nothing
End Sub
因爲這個,只有單純的item不能進行更爲快速的查找,有沒有一個對象,可以再添加進去的過程中就排好序呢?
下次分享更爲健全的SortedList對象使用
學習來源:完美Excel微信公衆號,感謝大佬的無私分享