• VBScript


    记录一些方法,关于 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


  • 相关阅读:
    ACwing 199 约数之和
    Acwing 222 青蛙的约会
    Acwing 220 最大公约数
    Acwing 200 Hankson的趣味题
    牛客 同余方程
    Acwing 198 反素数
    2020牛客多校 第六场B
    牛客 计数器
    Java基础-快捷键以及DOS命令
    A1111 Online Map (30分)(最短路径、Dijkstra+DFS)
  • 原文地址:https://www.cnblogs.com/bitssea/p/12625080.html
Copyright © 2020-2023  润新知