文档库 最新最全的文档下载
当前位置:文档库 › VBA数组与字典知识与实例---数组

VBA数组与字典知识与实例---数组

VBA数组与字典知识与实例---数组
VBA数组与字典知识与实例---数组

**************************************************************************************************** * VBA数组教程 * * --------excel精英培训网:兰色幻想 *

****************************************************************************************************从一个实例开始

Sub v4() '运行时间0.01秒

Dim t

t = Timer

For x = 1 To 100000

m = m + 1000 '真接调用内存中的值

Next x

MsgBox Timer - t

End Sub

Sub v5() '运行时间0.5秒

Dim t

t = Timer

For x = 1 To 100000

m = m + Cells(1, 1) '调用单元格中的值

Next x

MsgBox Timer - t

End Sub

运行的结果是直接调用内存中的值比调用单元格的值快了50倍,为什么会这样呢?我们需要了解一下VBA的运算原理

********** VBA的运算原理 *********

VBA中的运算最终是在内存中进行的,如果数据已经在内存中,则直接进行运算,但如果数据是储存在第三方对象(如单元格里,控件里)里,则还需要先把数据从第三方对象里调入到内存中,然后再在内存中对数据进行运算。

如果把v5的程序进行稍微改动,运行时间会大大缩短。

Sub v5_2() '运行时间0.5秒

Dim x, t

t = Timer

x = Cells(1, 1) '把单元格的值先交给变量

For x = 1 To 100000

m = m + x

Next x

MsgBox Timer - t

End Sub

如果VBA多次调用同一样单元格,我们可以先把这个单元格放在一个变量中,如果是多行多列的单元

格区域呢?我们同样可以把把这个区域的值装入一个VBA变量。

Sub v6()

x = Range("a1:10000")

End Sub

这个VBA变量装入大于1个的数据时,就构成了VBA内存数组。

那什么是VBA数组呢?

1、什么是VBA数组呢?

VBA数组就是储存一组数据的数据空间。数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组。

2 VBA数组的分类

A.按维数划分

1维数组

Sub t1()

Dim arr(1 To 10)

For x = 1 To 10

arr(x) = x

Next x

Stop

End Sub

2维数组

Sub t2()

Dim arr(1 To 10, 1 To 2)

For x = 1 To 10

For y = 1 To 2

arr(x, y) = x * y

Next y

Next x

Stop

End Sub

3维数组

Sub t3()

Dim arr(1 To 10, 1 To 2, 1 To 3)

For x = 1 To 10

For y = 1 To 2

For z = 1 To 3

arr(x, y, z) = x * y + z

Next z

Next y

Next x

Stop

End Sub

B 按储存类型划分

常量数组

Sub t4()

arr = Array(1, 2, 3, 4, 5)

arr1 = Array(Array(1, 2), Array(10, 20), Array(100, 200)) '数组的中储存数组

arr2 = [{"a",1;"b",2;"c",3}] '调用工作表内存数组构成VBA二维数组

Stop

End Sub

静态数组:固定大小的数组

静态数组声明方法

dim/public/private 数组名称( 第一维数组上标 to 第一维数组下标,第二维上标

to 第二维下标......)

Sub t5()

Dim arr1(10) '声明一个上标是0,下标是10的数组

Dim arr2(1 To 10) '声明一个上标是1,下标是10的数组

Dim arr3(1 To 10, 1 To 2) '声明一个10行2列的二维数组

End Sub

动态数组:大小不固定的数组

动态数组的声明方法:和静态数组不同的时,动态数组需要先用Dim声明,数组大小得出结果后还需要再用Redim进行二次声明。

Dim 数组名称()

Redim 数组名称( 第一维数组上标 to 第一维数组下标,第二维上标 to 第二维下标...) 例1:

Sub darr()

Dim arr() '声明一个动态的arr数组(不知道它能盛多少数据)

Dim k

k = Application.WorksheetFunction.CountIf(Range("a2:a60"), ">10") '计算大于10的个数

ReDim arr(1 To k) '再次声明arr的大小,正好盛下k数量的值

For x = 2 To 6

If Cells(x, 1) > 10 Then

m = m + 1

arr(m) = Cells(x, 1) '通过循环把大于10的数字装入数组

End If

Next x

MsgBox arr(2)

End Sub

如果数组需要随一个变量不断的扩充,数组就需要多次声明,每扩充一次就声明一次:

Redim Preserve (1 to k)

如果数组是多维的,只能动态声明第末维的,如果需要把让第一维不断扩充,还需要先转置,

有点麻烦,这里就不再详述,遇到这种情况,我们可以声明一个足够大的静态数组来取代动态数组,运行速度较前者快。

1 单元格区域存入VBA数组

Sub test()

Dim arr '声明一个变量用来盛放单元格数据

Dim x As Integer

arr = Range("a2:d5") '把单元格数据搬入到arr里,它有4列4行

For x = 1 To 4 '通过循环在arr数组中循环

arr(x, 4) = arr(x, 3) * arr(x, 2) '数组的第4列(金额)=第3列*第2例

Next x

Range("a2:d5") = arr '把数组放回到单元格中

End Sub

2 一维VBA数组放入单元格区域中

Sub test1()

Dim arr(1 To 5) '声明一维数组

For x = 1 To 5

arr(x) = x * 2 '通过循环给每个位置赋值

Next x

Range("A1:E1") = arr '把数组导入到excel中的a1:e1单元格中

Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要对数组进行转置后

再存放

End Sub

1.计算VBA数组的大小

Sub b1()

Dim arr(-3 To 4)

MsgBox UBound(arr) '下标

MsgBox LBound(arr) '上标

For x = -3 To 4

arr(x) = x * 2

Next x

MsgBox Application.Count(arr) '含有数据元素的个数

End Sub

Sub b2()

Dim arr

arr = Sheets(1).UsedRange 'Usedrange的行数和列数是未知的

MsgBox UBound(arr, 1) '可以计算这个区域有多少行

MsgBox UBound(arr, 2) '可以计算出这个区域有多少列

End Sub

2.VBA数组的筛选

Sub b3()

arr = Array("ABC", "A", "D", "CA", "ER")

arr1 = VBA.Filter(arr, "A", True) '筛选所有含A的数值组成一个新数组

arr2 = VBA.Filter(arr, "A", False) '筛选所有不含A的数值组成一个新数组

Stop

End Sub

3 VBA数组的拆分与合并

Sub t2()

arr2 = Range("A1:B4") '把单元格区域A1:B4的值装入数组arr2

arr3 = Application.Index(arr2, , 2) '把数组第2列拆分出来装入新数组arr3中, Stop新数组为二维数组

End Sub

如果想按行拆分,除了api函数外是没有其他办法的

4、VBA数组的最值

Sub t3()

arr = Array(1, 35, 4, 13)

MsgBox Application.Max(arr) '最大值

MsgBox Application.Min(arr) '最小值

End Sub

Sub t4()

arr = Array(1, 35, 4, 13)

MsgBox https://www.wendangku.net/doc/ed10853614.html,rge(arr, 2) '第2大值

MsgBox Application.Small(arr, 2) '第2小值

End Sub

5 数组的统计与求和

Sub t5()

arr = Array(1, 35, 4, 13)

MsgBox Application.Sum(arr) '对数组进行求和

End Sub

Sub t6()

arr = Array(1, 35, "a", 4, 13, "b")

MsgBox Application.Count(arr) '返回数字的个数4

MsgBox Application.CountA(arr) '返回数组文本和数字的总个数

End Sub

6.数组的查询

Sub t7()

arr = Array(1, 35, 4, 13)

MsgBox Application.Match(4, arr, 0) '查询数值4在数组Arr中的位置

End Sub

7 数组的转置

Sub t8()

arr = Array(1, 35, "a", 4, 13, "b")

arr1 = Application.Transpose(arr)

Stop

End Sub

Sub t9()

arr = Range("a1:a5")

arr1 = Application.Transpose(arr)

Stop

End Sub

8.字符串与VBA数组

Sub t1()

Dim arr, myst As String

myst = "A-REW-E-RWC-2-RWC"

arr = Split(myst, "-") '按-分隔成一组数装入数组中

k = Join(arr, ",") '再用","把数组的每个值连接成一个字符串,结果为"A,REW, Stop E,RWC,2,RWC"

End Sub

9.巧妙利用数组的标

因为数组的标是唯一的,所以我们就利用这个特点去除重复的数值

Sub r1()

Dim arr, arr2(1 To 13, 1 To 1)

arr = Range("a1:a13")

For x = 1 To UBound(arr)

arr2(arr(x, 1), 1) = arr(x, 1)

Next x

Range("b1").Resize(13) = arr2

End Sub

10.重新初始化数组

Sub r2()

Dim arr(1 To 10)

For x = 1 To 10

arr(x) = x

Next x

Stop

Erase arr '如果arr是动态数组,下次使用前还需要用redim设置数组的大小 Stop

For x = 1 To 10

arr(x) = x

Next x

Stop

End Sub

相关文档
相关文档 最新文档