VBA中的数据结构

字典

字典,其实就是一些“键-值”对。使用起来非常方便,有类似于微型数据库的作用,可用于临时保存一些数据信息。

创建

在 VBA 中创建字典对象时,需要添加对 "Microsoft Scripting Runtime" 库的引用。

一 、VBA中创建字典:用的是WSH引用。

Dim myd As Object

Set myd = CreateObject("Scripting.Dictionary")

或者

Dim myd As Dictionary

Set myd = new Dictionary

Dim myd As new Dictionary

方法

二 、字典的方法,有Add、Exists、Keys、Items、Remove、RemoveAll,六个方法。

① Add 用于添加内容到字典中。如myd.Add key, item 第一个参数为键,第二个参数为键对应的值

② Exists用于判断指定的关键词是否存在于字典(的键)中。如myd.Exists(key)。如果存在,返回True,否则返回False。通常会在向字典中添加条目的时候使用,即先判断字典中是否已存在这个记录,如果不存在则新增,否则进行其它的操作。

③ Keys获取字典所有的键,返回类型是数组。如myd.Keys()

④ Items获取字典所有的值,返回类型是数组。如myd.Items()

⑤ Remove从字典中移除一个条目,是通过键来指定的。myd.Remove(key)如果指定的键不存在,会发生错误。

⑥ RemoveAll 清空字典。

属性

三 、字典的属性 有Count、Key、Item、ConpareMode四种属性

① Count用于统计字典中键-值对的数量。也可以简单理解为统计字典中键的个数;

② Key用于更改字典中已有的键。如:myd.Key("oapp") = "Orange" 如果指定的键不存在,则会产生错误。

③Item用于写入或读取字典中指定键的值,如果指定的键不存在,则会新增。如.Item("oapp") = 10

实例

下面以一个实例来说明字典的应用:在下图的A列有不同的键,要在对应的键中写入键值,然后把C列对应的键去掉,并任意增加一个键,最后在E,F列写出最后的键和键值:

VBA中的数据结构_第1张图片

代码如下:

Sub mynzdd()
    Dim dic As Object
    Sheets("Sheet1").Select
    Set dic = CreateObject("Scripting.Dictionary") '引用字典
    Dim arr(1 To 100), i As Long '建立一个数组用来给键赋值
    For i = 1 To 100
        arr(i) = i + 99
    Next i
    i = 1
    Do While Cells(i, 1) <> ""
        dic(Cells(i, "a").Value) = arr(i) '写入键和键值,要注意写入的方法
        i = i + 1
    Loop
    i = 1
    Do While Cells(i, 3) <> ""
        dic.Remove (Cells(i, "c").Value) '移除C列的键值
        i = i + 1
    Loop
    dic.Add arr(100), "234" '增加一个键对应的键是arr(100)即199,键值是234
    [e1].Resize(dic.Count, 1) = Application.Transpose(dic.Keys) '转置显示键
    [f1].Resize(dic.Count, 1) = Application.Transpose(dic.Items) '转置显示键值
End Sub

结果截图:

VBA中的数据结构_第2张图片

数组

定义

1、VBA数组的定义方法

下面是几种数组常用的定义方法,一维数组的定义、二维数组的定义

直接赋值定义、调用Array函数定义、调用Excel工作表内存数组

直接定义给数组赋值
一维常量数组的定义
Sub arrDemo1()
    Dim arr(2) As Variant   '数组
    arr(0) = "vba"
    arr(1) = 100
    arr(2) = 3.14
    MsgBox arr(0)
End Sub
二维常量数组的定义
Sub arrDemo2()
    Dim arr(1, 1) As Variant  'Dim arr(0 To 1, 0 To 1) As Variant
    arr(0, 0) = "apple"
    arr(0, 1) = "banana"
    arr(1, 0) = "pear"
    arr(1, 1) = "grape"
    For i = 0 To 1
        For j = 0 To 1
            MsgBox arr(i, j)
        Next
    Next
End Sub
用array函数创建常量数组
一维数组
Sub arrayDemo3()
    Dim arr As Variant   '数组
    arr = Array("vba", 100, 3.14)
    MsgBox arr(0)
End Sub
'二维数组
Sub arrayDemo4()
    Dim arr As Variant   '数组
    arr = Array(Array("张三", 100), Array("李四", 76), Array("王五", 80))
    MsgBox arr(1)(1)
End Sub
调用Excel工作表内存数组
'一维数组[{"A",1,"C"}]
'二维数组[{"a",10;"b",20;"c",30}]
Sub mylook()
    Dim arr
    Dim arr2
    arr = [{"a",10;"b",20;"c",30}]
    arr2 = [{"A",1,"C"}]
    Range("a1:c4") = arr
    Range("c1:f2") = arr2
    MsgBox Application.WorksheetFunction.VLookup("b", arr, 2, 0)  '调用vlookup时可以作为第二个参数
End Sub
动态数组的定义方法
Sub arrDemo5()
    Dim arr1() '声明一个动态数组(动态指不固定大小)
    Dim arr2  '声明一个Variant类型的变量
    arr1 = Selection   '把单元l格区域A1:B2的值装入数组arr1
    arr2 = Selection   '把单元格区域A1:B2的值装入数组arr2
    MsgBox arr1(1, 1)  '读取arr数组中第1行第1列的数值
    MsgBox arr2(2, 2) '读取arr1数组的第2行第2列的数值
End Sub

数组的赋值和计算

读取单元格数据到数组,进行计算,再赋值给单元格
Sub arr_calculate()
    Dim arr     '声明一个变量用来盛放单元格数据
    Dim i%
    arr = Range("a2:d5")     '把单元格数据搬入到arr里,它有4列4行
    For i = 1 To 4     '通过循环在arr数组中循环
    	arr(i, 4) = arr(i, 3) * arr(i, 2)      '数组的第4列(金额)=第3列*第2例
	Next i
	Range("a2:d5") = arr     '把数组放回到单元格中
End Sub

数组的合并(join)与拆分(split)

'数组合并(join)与拆分(Split)
Sub join_demo()
    Dim a As Variant
    Dim b As Variant
    ' Join using spaces
    a = Array("Red", "Blue", "Yellow")
    b = Join(a, " ")
    MsgBox ("The value of b is :" & b) 'Red Bule Yellow

    ' Join using $
    b = Join(a, "$")                   'Red$Bule$Yellow
    MsgBox ("The Join result after using delimiter is : " & b)
End Sub

Sub split_demo()
    Dim a As Variant
    Dim b As Variant
    a = Split("Red$Blue$Yellow", "$")     'a = Array("red","blue","yellow")
    b = UBound(a)
    For i = 0 To b
    MsgBox a(i)
Next
End Sub

数组的筛选(Filter)

vba数组的筛选
Sub arr_filter()
    arr = Array("ABC", "F", "D", "CA", "ER")
    arr1 = VBA.Filter(arr, "A", True) '筛选所有含A的数值组成一个新数组
    arr2 = VBA.Filter(arr, "A", False) '筛选所有不含A的数值组成一个新数组
    MsgBox Join(arr1, ",") '查看筛选的结果
End Sub

数组维度的转换(Transpose)

数组维数的转换
一维转二维
Sub arr_tranpose1()
    arr = Array(10, "vba", 2, "b", 3)
    arr1 = Application.Transpose(arr)
    MsgBox arr1(2, 1) '转换后的数组是1列多行的二维数组
End Sub
二维数组转一维
'注意:在转置时只有1列N行的数组才能直接转置成一维数组
Sub arr_tranpose2()
    arr2 = Range("A1:B5")
    arr3 = Application.Transpose(Application.Index(arr2, , 2)) '取得arr2第2列数据并转置成1维数组
    MsgBox arr3(4)
End Sub

把单元格中的内容用“-”连接起来
Sub join_transpose_demo()
    arr = Range("A1:C1")
    arr1 = Range("A1:A5")
    MsgBox Join(Application.Transpose(Application.Transpose(arr)), "-")
    MsgBox Join(Application.Transpose(arr1), "-")
End Sub

利用数组获取所有工作表名称的自定义函数

'利用数组获取所有工作表名称的自定义函数
Function getSheetsname(id)
    Dim i%, arr()
    k = Sheets.Count
    ReDim arr(1 To k)
    For i = 1 To k
    	arr(i) = Sheets(i).Name
	Next
	getSheetsname = Application.Index(arr, id)
End Function

数组赋值,提高计算效率

'数组赋值,提高计算效率
'2.03秒
Sub dataInput()
    Dim start As Double
    start = Timer
    Dim i&
    For i = 1 To 30000
    	Cells(i, 1) = i
    Next
    MsgBox "程序运行时间为" & Format(Timer - start, "0.00") & "秒"
End Sub

'0.12秒
Sub dataInputArr()
    Dim start As Double
    start = Timer
    Dim i&, arr(1 To 30000) As String
    For i = 1 To 30000
    	arr(i) = i
    Next
    Range("a1:a30000").Value = Application.Transpose(arr)
    MsgBox "程序运行时间为" & Format(Timer - start, "0.00") & "秒"
End Sub

'0.09秒
Sub dataInputArr2()
    Dim start As Double
    start = Timer
    Dim i&, arr(1 To 30000, 1 To 1) As String
    For i = 1 To 30000
    	arr(i, 1) = i
    Next
    Range("a1:a30000").Value = arr
    MsgBox "程序运行时间为" & Format(Timer - start, "0.00") & "秒"
End Sub

方法

  1. Sort:对数组进行排序。
  2. Reverse:将数组元素反转。
  3. Join:将数组元素按指定分隔符连接成一个字符串
  4. UBound函数返回指定数组的上界(最大索引),而LBound函数返回指定数组的下界(最小索引)。这两个函数可以用于一维或多维数组。以下是它们的基本语法:UBound(ArrayName, [Dimension])

LBound(ArrayName, [Dimension])

其中,ArrayName是要操作的数组名称,Dimension是可选参数,用于指定数组的维度。如果未提供维度参数,则默认为第一维。

集合

collection 对象在 VBA 中提供了一些常用的方法和属性,用于操作和管理集合中的元素。下面是 Collection 的一些常见:

方法:

  • Add(Item, [Key], [Before], [After]): 将项添加到集合中。Item 是要添加的元素,Key 是可选参数,指定元素的键值(用于检索元素),Before 和 After 是可选参数,用于指定新元素的插入位置。
  • Remove(Index): 按照索引从集合中删除元素。Index 是要删除的元素的索引。

Count(): 返回集合中的元素数量。

  • Item(Index): 返回指定索引处的元素。

属性:

  • Item(Key): 返回具有指定键值的元素。
  • Count(): 返回集合中的元素数量。
  • Key[Index]: 返回指定索引处的元素键值。
  • Parent:返回包含集合的对象。

你可能感兴趣的:(数据结构,excel)