1. 程式人生 > >VBScript - 動態 Array 實現方法大全!

VBScript - 動態 Array 實現方法大全!

>記錄一些方法,關於 VBScript 中,動態 Array 的實現 ,也適用於 VBA, 很久以前,寫 VBA 的時候,就覺得使用 Array 很不方便,因為大小固定, 當時想的是,要是 Array 可以像 Python 裡的 list 一樣好用該多好啊, 那麼下面,就記錄一些方法,能讓 Array 變得動態,並且好用!
### 實現方法-1: 在下面的例項中,先設定一個空的 Array 出來, 然後用,下面的方法實現動態 Array, 並且,把數字 1 到 10,一個加到 Array 中去。 ```VB '動態 Array 實現 myArray = Array() For i = 1 To 10 ReDim Preserve myArray(UBound(myArray) + 1) myArray(UBound(myArray)) = i Next ``` 那麼動態 Array 就這麼開心的實現啦,(^_−)☆ 對比下和 Python list 的程式碼吧,感覺是不是很像呢。 ```Python # Python 中 list 的使用 myList = list() for i in range(10): myList.append(i) print(myList) ``` #### 資料輸出: 然後,思考下一個問題,也是我之前寫 VBA 時候考慮的問題, 就是,怎麼一下子,看到 Array 中所有的資料, 之前的本方法,是使用 For Loop,把 Array 中的資料一個個 Print 出來, 但是現在發現了簡單的方法,程式碼如下: ```VB '最簡單的方法: 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, 具體使用方法如下: ```VB '建立一個字典(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` 具體使用方法如下: ```VB '呼叫 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 中常用的類似方法,是上面那兩種, 那麼,我們來看下,具體使用方法: ```VB '宣告變數,建立 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,來實現類似陣列功能的感覺, 好的,就這些了,希望對大家有幫助, 小白貢獻,語失莫怪。
### 參考閱讀: 1. [VBA 字典與集合(Dictionary與Collection)](https://blog.csdn.net/yanlovehan/article/details/54097658) 2. [Lists in VBScript - Stack Overflow](https://stackoverflow.com/questions/13585660/lists-in-vbscript) 3. [Dictionary object | Microsoft Docs](https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object) 4. [Windows Script Host - Tim Hill - Google Books](https://books.google.co.uk/books?id=mBvUA0KziRAC&pg=PA204&lpg=PA204&dq=scripting.dictionary+%E5%B1%9E%E4%BA%8Ewsh&source=bl&ots=G0BJ8R5-5h&sig=ACfU3U3H1mIndzvQJrcgQwIbSUd3KYvYMg&hl=en&sa=X&ved=2ahUKEwiyv5CcvczoAhVhpHEKHdq7CzwQ6AEwA3oECAsQLg#v=onepage&q=scripting.dictionary%20%E5%B1%9E%E4%BA%8Ewsh&f=false) 5. [Does VBA have Dictionary Structure? - Stack Overflow](https://stackoverflow.com/questions/915317/does-vba-have-dictionary-structure) 6. [VBS基礎篇 - 動態陣列](https://www.cnblogs.com/wakey/p/5772766.html) 7. [asp classic - What really is a Collection object in asp using vbscript? - Stack Overflow](https://stackoverflow.com/questions/44093685/what-really-is-a-collection-object-in-asp-using-vbscript) 8. [The Ultimate Guide To Collections in Excel VBA - Excel Macro Mastery](https://excelmacromastery.com/excel-vba-collections/) 9. [VBA for smarties: Collection](https://www.snb-vba.eu/VBA_Collection_en.html) 10. [ArrayList Class (System.Collections) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.collections.arraylist?view=netframework-4.8) <