记录一些方法,关于 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 实现方法大全!的更多相关文章

  1. javascript Array类型 方法大全

    1,创建数组 //第一种是使用Array构造函数 var colors = new Array(); var colors = new Array(20); //创建length为20的数组 var ...

  2. VBScript - 弹出“文件选择对话框”方法大全!

    本文记录,VBScript 中,各种打开 "文件选择对话框" 的方法. 实现方法-1 (mshta.exe): 首先,我们要实现的就是,弹出上面的这个"文件选择对话框&q ...

  3. JavaScript Array数组方法详解

    Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...

  4. JavaScript数组方法大全(推荐)

    原网址:http://www.jb51.net/article/87930.htm 数组在笔试中经常会出现的面试题,javascript中的数组与其他语言中的数组有些不同,为了方便之后数组的方法学习, ...

  5. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  6. 301重定向方法大全及SEO中网址规范化,看着不错先收下

    301重定向方法大全及SEO中网址规范化 现在大多数网站都存在一些内容相同但网址(URL)不一样的重复内容,这些重复的内容对于搜索引擎来说却可能被认为是复制网页,复制网页虽然不会被惩罚但因多个网址存在 ...

  7. 转载收藏(js数组方法大全)

    js数组方法大全 JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组var arr2 = new Arra ...

  8. JavaScript数组方法大全(第二篇)

    数组方法大全(第二篇) 注意:如有错误欢迎指出,如有雷同纯属巧合,本博客参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 forEach()方法 遍历数组,里面可以传递一个方法 v ...

  9. js数组方法大全(上)

    # js数组方法大全(上) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 join() reverse() sort() concat() slice( ...

随机推荐

  1. JavaScript学习总结之数组常用的方法和属性

    先点赞后关注,防止会迷路寄语:没有一个冬天不会过去,没有一个春天不会到来. 前言数组常用的属性和方法常用属性返回数组的大小常用方法栈方法队列方法重排序方法操作方法转换方法迭代方法归并方法总结结尾 前言 ...

  2. 做直播能有多赚钱,Python告诉你

    前面我们介绍了APP爬虫环境的搭建和mitmproxy工具的简单使用,这次我们要来一个简单的APP爬虫,尝试一下APP爬虫的简单实用,顺便让我们看看喜马拉雅上的主播到底有多赚钱. APP爬虫一般分为两 ...

  3. VUE实现Studio管理后台(三):支持多语言国际化(vue-i18n)

    RXEditor的第一版本是英文版,有些朋友看起来觉得不习惯,后来因为惰性,不愿意再修改旧代码加入中文版,这次提前就把这个问题解决了,克服惰性最好的方式,就是想到就尽快去做,避免拖延. 本来计划在界面 ...

  4. 进阶之路 | 奇妙的Handler之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Handler的基本概念及使用 学习导图: 一.为什么要学习Handler? 在Andr ...

  5. 前端每日实战:146# 视频演示如何用纯 CSS 创作一个脉动 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wYvGwr 可交互视频 此视频是可 ...

  6. 脚本写一行echo也能写出bug ? glob了解一下

    背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a. 最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的. 又经过 ...

  7. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  8. 使用AtomicStampedReference<T>的大坑

    //在初始化的时候会把引用和时间戳存到pair中 AtomicStampedReference<Integer> integerAtomicStampedReference = new A ...

  9. 手机抓包app在python中使用

    使用python+airtesr+无线模式控制手机 官方文档中,在airtest.readthedocs.io/zh_CN/lates…有一段介绍如何连接安卓手机的例子: 但是这个线接模板,无线模式的 ...

  10. Spark入门(五)--Spark的reduce和reduceByKey

    reduce和reduceByKey的区别 reduce和reduceByKey是spark中使用地非常频繁的,在字数统计中,可以看到reduceByKey的经典使用.那么reduce和reduceB ...