记录一些方法,关于 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. Python爬虫开发教程

     正文   现在Python语言大火,在网络爬虫.人工智能.大数据等领域都有很好的应用.今天我向大家介绍一下Python爬虫的一些知识和常用类库的用法,希望能对大家有所帮助.其实爬虫这个概念很简单,基 ...

  2. java8新特性——stream笔记

    stream对象 Stream IntStream LongStream DoubleStream 创建 常用的三种方式: 使用list对象: list.stream() − 为集合创建串行流. li ...

  3. vs2019 目标框架是灰色的原因

    原因一是没有安装.net core 包: 如果是桌面程序,不是web程序:不安装.net core包的情况,修改工程文件 TargetFrameworks  ---->  TargetFrame ...

  4. Linux-基本操作(登入登出,图形化界面,命令行界面)

    命令行界面登录 (1)命令行登录界面 安装好Centos后,系统启动默认进入的是图形化界面,可以通过如下命令修改进入命令行界面: 命令行登录:systemctl  set-default  multi ...

  5. 手摸手教你在vue-cli里面使用vuex,以及vuex简介

    写在前面: 这篇文章是在vue-cli里面使用vuex的一个极简demo,附带一些vuex的简单介绍.有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家. 本文首发于我的个人 ...

  6. 前端的事件冒泡(例如点击一次onclick事件执行两次)解决办法

    问题概要: 当我运用antd 中 radio组件的时候发现radio组件是有bug的 就是你不能给他赋予id 和 value,同时也绑定不上onclick等事件.举个例子: 可以看到 你就算赋予了id ...

  7. 使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期

    面试问题 Redis 如何实现查询附近的人? 涉及知识点 Redis 中如何操作位置信息? GEO 底层是如何实现的? 如何在程序实现查询附近的人? 在实际使用中需要注意哪些问题? 视频答案 视频地址 ...

  8. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  9. angular 动态绑定class 写法

    [ngClass]="{'aaa':true,'bbb':!true}" 这个是正确的   [ngClass]="{ true ? 'aaa':'bbb'}" ...

  10. 3DGIS与BIM集成集成技术及铁路桥梁可视化系统

    3DGIS与BIM的集成技术 3DGIS与BIM的集成技术包括2部分:一是将Revit软件生成的BIM针对3DGIS的快速无损格式转换,这种转换包括几何信息(如形状.位置等信息)和属性信息(如建筑信息 ...