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

来源:https://www.cnblogs.com/bitssea/archive/2020/04/04/12625080.html
-Advertisement-
Play Games

記錄一些方法,關於 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,來實現類似數組功能的感覺,
好的,就這些了,希望對大家有幫助,
小白貢獻,語失莫怪。

參考閱讀:

  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



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript 是基於面向對象和事件驅動的一門語言,事件模型是 DOM 中至關重要的內容,理解事件驅動機制、事件反饋、事件冒泡、事件捕獲以及事件委托能幫助我們更好的處理事件,寫出更優的代碼 ...
  • 01. 聊 啥 關註“一猿小講”的都知道,我們之前分享過應用架構、應用監控、日誌歸集以及程式員日常內心的那些小揪揪,幾乎成了小講、雜談的一畝三分地。 說實話,挺神奇,我也不知道每次會給大家帶來什麼驚喜。 今天的分享也不例外,你們肯定也意想不到,今天我分享的主題居然是:矛與盾,如何做好系統之盾;說人話 ...
  • 默默在看新機會的你,是不是面試的時候,偶爾被問起“能不能簡單介紹一下項目的應用系統架構”? 沉迷於業務開發的你們,有沒有考慮過“用戶訪問到你開發的業務功能,到底經過了哪些環節”? 今天我將結合這些年的一些認知理解,開壇設法給大家講一講應用系統架構的從 0 到 1。 01. 如何造一個大泥球? 產品汪 ...
  • 基本定義 裝飾者模式屬於 結構型模式 ,它可以 動態的 將新功能 附加到對象上 ,同時又 不改變其結構 。在對象功能擴展方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(OCP)。 模式結構 裝飾者和被裝飾者有 相同的超類型 ,因為裝飾者和被裝飾者必須是一樣的類型, 利用繼承是為了達到類型的匹配, ...
  • 基於觀察者模式,構建自己的一套事件分發系統。由常見的引用耦合問題,引出觀察者模式,進而利用觀察者模式的最佳實踐,事件分發系統來解決耦合問題。文章詳細解讀了事件分發系統的實現步驟,以及需要註意的一些坑。 ...
  • 1. 新建項目 IDEA中新建Maven項目,使用Maven Archetype原型:maven archetype webapp 新建項目結構為: 2. 新建包目錄 新建Java代碼目錄:src.main.java 下新建分層模型package,帶上項目的 (僅供參考) :存放全局變數,公共枚舉等 ...
  • 作為一名程式員,io知識是必不可少,其實一直在和io打交道,要麼顯示要麼隱含給了操作系統,故做下關於io的記錄。說io之前呢,先介紹什麼叫同步非同步丶阻塞非阻塞 1. 同步非同步丶阻塞非阻塞 1.1 同步是指發出一個請求,在沒有得到結果之前該請求就不返回結果,請求返回時,也就得到結果了。比如我經常用燒水 ...
  • 昨天有同事問 UserService、XxxService 都會調用 Dao 的 insert、update ... ...,這些重覆的代碼,有沒有辦法變得靈活一些? 巧了,和咱們分享的主題剛好碰上,賣個關子,先不談解決方案,就當啥事沒有發生,重新引入今天的話題(捂嘴笑)。 想蛻變的研發人員,偶爾會 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...