之前很多文章都讲过VBA数组。
但是VBA数组比较鸡肋,功能比较弱,使用起来不是很方便,需要自行封装很多数组方法,这对于新手来说很不友好。
今天给大家讲讲,怎么用.Net自带的ArrayList扩展VBA数组功能。
前言
要在VBA中使用.Net的ArrayList,需要提前导入mscorlib.dll引用。参见下图。本文会分享ArrayList常用的一些方法。
添加元素方法:Add,Insert
Add:用于在元素尾部添加元素
Insert用于在任意位置添加元素
Sub ArrayListExample()
'声明和创建ArrayList对象
Dim MyList As New ArrayList
' 添加值
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Insert 2, "Inseted" ' Insert元素
MyList.Insert 1, "Inseted another" ' Insert元素
For i = 0 To 2
arr.Add i
Next
'遍历ArrayList
For N = 0 To MyList.Count - 1
MsgBox MyList(N)
Next
'也可以用For Each遍历ArrayList
For Each I In MyList
MsgBox I
Next
End Sub
通过下标修改元素
需要注意的是,ArrayList下标,始终从0开始(即便我们通过Option Base 1设置下标从1开始),这点跟VBA内置的数组不一样。
Sub ArrayListExample()
'Create new array list object
Dim MyList As New ArrayList
'Add items to list
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
'Change item 1 from ‘Item2’ to ‘Changed’
MyList(1) = "Changed"
'Iterate through array list to prove change worked
For Each I In MyList
'Display item name
MsgBox I
Next I
End Sub
判断是否包含某个元素:Contains
ArrayList可以用Contains方法,判断是否包含某个元素,返回布尔值。
True:包含,False:不包含。
Sub testArrayList_Contains()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素
For Each value In Array("hello", "world", "VBA", 1, 3, 5, True, False)
arr.Add value
Next
' 判断是否包含元素
Debug.Print arr.Contains("VBA") ' True
Debug.Print arr.Contains("xxx") ' False
End Sub
元素查找:IndexOf和LastIndexOf
IndexOf和LastIndexOf都可以用于查找元素在ArrayList的位置。不同的是,IndexOf用于正向查找,LastIndexOf反向查找(即从最后一个元素开始倒过来查找)。
ArrayList.IndexOf(查找值,从哪个下表开始),如果查找的值不存在,返回-1.
ArrayList.LastIndexOf(查找值)。如果不存在,返回-1.
Sub testArrayList_IndexOf()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素
For Each value In Array("hello", "world", "VBA", 1, 3, "world", True, False)
arr.Add value
Next
' 查找元素下标。
' 返回值的下标始终从0开始
Debug.Print arr.IndexOf("VBA", 0) ' 2
Debug.Print arr.IndexOf("xxx", 0) ' -1,查找的值不存在
Debug.Print arr.LastIndexOf("world") ' 5
End Sub
删除元素:Remove,RemoveAt,RemoveRange
Remove(value):从ArrayList中删除给定的值。只删除第一个找到的元素,有多个也值删除第一个。
RemoveAt(index):从ArrayList中,删除给定下标的值。
RemoveRange(index, count):从ArrayList中,从下标index开始,删除指定个数count的元素。
Sub testArrayList_Remove()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素
For Each value In Array("hello", "world", "VBA", 1, 1, "world", "hello")
arr.Add value
Next
' 删除元素
arr.Remove "world" ' 只删除第一个找到的元素
arr.RemoveAt 0 ' 删除下标为0的元素
arr.RemoveRange 0, 2 ' 删除下标从0开始,删除2个元素
End Sub
元素反转:Reverse
顾名思义,将整个ArrayList中元素的顺序反转。
Sub testArrayList_Reverse()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array("a", "work", "life", "balance")
arr.Add value
Next
For Each value In arr
Debug.Print value ' 这时候元素的顺序是,a, work, life, balance
Next
' 元素顺序反转
arr.Reverse
For Each value In arr
Debug.Print value ' 这时候元素的顺序发生反转,balance, life, work, a
Next
End Sub
元素排序:Sort
Sort可以对元素进行升序排序。
Sub testArrayList_Sort()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array(1, 5, 2, 6, 3, 8)
arr.Add value
Next
' 元素升序排序
arr.Sort
For Each value In arr
Debug.Print value
Next
End Sub
复制:Clone
Clone方法可以浅复制ArrayList。
Sub testArrayList_Clone()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array(1, 5, 2, 6, 3, 8)
arr.Add value
Next
' ArrayList复制
Set arr2 = arr.Clone
End Sub
获取元素个数:Count
用Count方法,可以获取到ArrayList内元素的个数。
Sub testArrayList_Count()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array(1, 5, 2, 6, 3, 8)
arr.Add value
Next
Debug.Print arr.Count ' 6
End Sub
清空所有元素:Clear
Clear方法用于情况ArrayList所有元素。
Sub testArrayList_Clear()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array(1, 5, 2, 6, 3, 8)
arr.Add value
Next
arr.Clear
Debug.Print arr.Count ' 0
End Sub
转换成VBA数组:ToArray
ToArray方法可以把ArrayList转成VBA的数组。
Sub testArrayList_ToArray()
Dim arr As New ArrayList ' 定义ArrayList
' 添加元素.
For Each value In Array(1, 5, 2, 6, 3, 8)
arr.Add value
Next
arr2 = arr.ToArray
For Each value In arr2
Debug.Print value
Next
End Sub