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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...