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


記錄一些方法,關於 VBScript 中,動態 Array 的實現 ,也適用於 VBA,

很久以前,寫 VBA 的時候,就覺得使用 Array 很不方便,因為大小固定,
當時想的是,要是 Array 可以像 Python 里的 list 一樣好用該多好啊,
那么下面,就記錄一些方法,能讓 Array 變得動態,並且好用!

實現方法-1:

在下面的實例中,先設定一個空的 Array 出來,
然后用,下面的方法實現動態 Array,
並且,把數字 1 到 10,一個加到 Array 中去。

'動態 Array 實現
Dim myArray()
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,來實現類似數組功能的感覺,
好的,就這些了,希望對大家有幫助,
小白貢獻,語失莫怪。

參考閱讀:

  1. VBA 字典與集合(Dictionary與Collection)
  2. Lists in VBScript - Stack Overflow
  3. Dictionary object | Microsoft Docs
  4. Windows Script Host - Tim Hill - Google Books
  5. Does VBA have Dictionary Structure? - Stack Overflow
  6. VBS基礎篇 - 動態數組
  7. asp classic - What really is a Collection object in asp using vbscript? - Stack Overflow
  8. The Ultimate Guide To Collections in Excel VBA - Excel Macro Mastery
  9. VBA for smarties: Collection
  10. ArrayList Class (System.Collections) | Microsoft Docs



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM