码迷,mamicode.com
首页 > 其他好文 > 详细

VBScript - 动态 Array 实现方法大全!

时间:2020-04-04 10:01:18      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:lock   读取   返回字典   自带   href   overflow   访问   research   rac   

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


VBScript - 动态 Array 实现方法大全!

标签:lock   读取   返回字典   自带   href   overflow   访问   research   rac   

原文地址:https://www.cnblogs.com/bitssea/p/12625080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!