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微信公衆號,感謝大佬的無私分享

發佈了14 篇原創文章 · 獲贊 10 · 訪問量 1767
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章