之前很多文章都讲过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
