記錄一些方法,關於 VBScript 中,動態 Array 的實現 ,也適用於 VBA, 很久以前,寫 VBA 的時候,就覺得使用 Array 很不方便,因為大小固定, 當時想的是,要是 Array 可以像 Python 里的 list 一樣好用該多好啊, 那麼下麵,就記錄一些方法,能讓 Array ...
記錄一些方法,關於 VBScript 中,動態 Array 的實現 ,也適用於 VBA,
很久以前,寫 VBA 的時候,就覺得使用 Array 很不方便,因為大小固定,
當時想的是,要是 Array 可以像 Python 里的 list 一樣好用該多好啊,
那麼下麵,就記錄一些方法,能讓 Array 變得動態,並且好用!
實現方法-1:
在下麵的實例中,先設定一個空的 Array 出來,
然後用,下麵的方法實現動態 Array,
並且,把數字 1 到 10,一個加到 Array 中去。
'動態 Array 實現
myArray = Array()
For i = 1 To 10
ReDim Preserve myArray(UBound(myArray) + 1)
myArray(UBound(myArray)) = i
Next
那麼動態 Array 就這麼開心的實現啦,(^_−)☆
對比下和 Python list 的代碼吧,感覺是不是很像呢。
# Python 中 list 的使用
myList = list()
for i in range(10):
myList.append(i)
print(myList)
數據輸出:
然後,思考下一個問題,也是我之前寫 VBA 時候考慮的問題,
就是,怎麼一下子,看到 Array 中所有的數據,
之前的本方法,是使用 For Loop,把 Array 中的數據一個個 Print 出來,
但是現在發現了簡單的方法,代碼如下:
'最簡單的方法:
MsgBox Join (myArray, vblf)
'之前使用的笨方法:
For Each i In myArray
Debug.Print i
Next
實現方法-2:
之後 Research 還發現了更多的方法,來實現近似動態 Array 的方法,
其中一種,就是使用,CreateObject("Scripting.Dictionary")
,
Scripting.Dictionary 是字典對象的 ProgID,
但,這種方法使用的,並不是 VBScript 自帶的 Object,
而是,調用了 Microsoft Scripting Runtime Library (SCRRUN.DLL) 中的一個對象,
字典(Dictionary),通常也被稱為 associative array (關聯數組),
但是,從數據類型上說,字典是一個 Object,並不是 Array,
具體使用方法如下:
'創建一個字典(dic)
Set dic = CreateObject("Scripting.Dictionary")
'添加,鍵值/名稱 (key/item)
dic.Add "a", "Athens"
dic.Add "b", "Belgrade"
dic.Add "c", "Cairo"
'如果不想,成對的添加值,可以省略 item,只添加 key
dic.Add "Key1", ""
dic.Add "Key2", ""
dic.Add "Key3", ""
'刪除,鍵值/名稱 (只能通過 key 來刪除)
dic.remove "b"
'刪除字典中所有值
dic.RemoveAll
'返回字典中 Item 的個數
dic.Count
'判斷某個 key 是否已經存在於字典中了,
'如果已經存在了,我們可以選擇不添加到字典中,
'這種方法可以用於,對數據去重,選出 Unique Value!
dic.Exists("c")
'遍歷字典的方法
oKeys = dic.Keys
oItems = dic.Items
For i = 0 To dic.Count - 1
MsgBox (oKeys(i) & " : " & oItems(i))
Next
實現方法-3:
還有一種方法,就是使用CreateObject("System.Collections.ArrayList")
,
這種方法調用的是,屬於.NET Framework(4.8)下的 COM,源自於 mscorlib.tlb 文件,
這種方法下,比使用 Dictionary 的方法,多了個更方便的“排序功能”,
而,要想在 Dictionary 中進行排序,可是很麻煩的,要使用多層 Loop,
而這種方法下,只需要使用,一個 Method 即可,ArrList.sort
具體使用方法如下:
'調用 Object,創建 ArrayList
Set ArrList = CreateObject("System.Collections.ArrayList")
'添加 Item 進 ArrayList
ArrList.Add "Item3"
ArrList.Add "Item2"
ArrList.Add "Item1"
'返回 ArrayList 中 Item 個數
ArrList.Count
'返回 ArrayList 的容量
ArrList.Capacity
'對 ArrayList 排序
ArrList.Sort
'刪除 Item
ArrayList.Remove("Item1")
'清空 ArrayList
ArrayList.Clear
'遍歷 ArrayList 中的 Items
For i = 0 To ArrList.Count - 1
WScript.Echo ArrayList(i)
Next
實現方法-4(VB,VBA 專用):
這種方法使用的是,Collection 數據類型,
而,VBScript 下麵是沒有 Collection 這種數據類型的,
所以,這種方法是 VB 和 VBA 專用的方法,
VBScript 中常用的類似方法,是上面那兩種,
那麼,我們來看下,具體使用方法:
'聲明變數,創建 Collection 對象
Dim Coll As Collection
Set Coll = New Collection
'添加元素,添進去的數據,是 String 類型
Coll.Add "Data1"
Coll.Add "Data2"
Coll.Add "Data3"
'在第二個元素之前,添加新元素
Coll.Add "Data4", Before:=2
'刪除第二個元素
Coll.Remove 2
'讀取 Collection 中的數據
Debug.Print Coll(1)
Debug.Print Coll.Item(2)
'往 Collection 裡面添加 Object(對象)
Dim Coll As New Collection '創建一個 Collection
Dim New_Object As New Class1 '創建一個新 Class Object
New_Object.fruit = "Apple" '設定新 Object 的 fruit 屬性,等於 Apple
coll.Add New_Object '把這個新 Object添加到,我們的 Collection 中去
Debug.Print Coll(1).fruit '訪問 Collection 中,Object 的屬性
'也可以像字典一樣使用,Key 必須是 String,而且 Unique
Coll.Add Item:="Apple", key:="Key1"
Coll.Add "Orange", "Key2"
'訪問 Collection 中的 Item,只能通過 Key 訪問 Item,沒法反過來
Debug.Print Coll("Key1")
篇尾總結:
差不多,在 VBScript,或者 VBA,想要實現動態 Array,無非就是這些方法了,
從性質上分類,大致就兩類,要麼就是使用自帶的 Array,不斷的改變 Array的大小,
要麼就是,使用其他各種 Object,來實現類似數組功能的感覺,
好的,就這些了,希望對大家有幫助,
小白貢獻,語失莫怪。
參考閱讀:
- VBA 字典與集合(Dictionary與Collection)
- Lists in VBScript - Stack Overflow
- Dictionary object | Microsoft Docs
- Windows Script Host - Tim Hill - Google Books
- Does VBA have Dictionary Structure? - Stack Overflow
- VBS基礎篇 - 動態數組
- asp classic - What really is a Collection object in asp using vbscript? - Stack Overflow
- The Ultimate Guide To Collections in Excel VBA - Excel Macro Mastery
- VBA for smarties: Collection
- ArrayList Class (System.Collections) | Microsoft Docs