文档库 最新最全的文档下载
当前位置:文档库 › VBA数组进阶

VBA数组进阶

VBA数组进阶
VBA数组进阶

VBA 数组进阶

————进阶即为进阶即为进阶即为探寻探寻探寻细节细节细节,,“实践出真知实践出真知””

此篇献给探索VBA 和所有关心我们地球家园的朋友们!

此篇版权归https://www.wendangku.net/doc/2215588187.html, 和https://www.wendangku.net/doc/2215588187.html, 网站

欢迎大家转载,但请保留出处

HOmT398

2009.4.18于北京

一、数组数组基本概念基本概念基本概念

1、 什么是数组什么是数组

数组是一组数。

数组是一组有序列的数。

数组是一组连续可索引的具有相同内在数据类型的元素所成的集合,在未指定为变体变量情况下。

2、 上界上界、、下界下界和下标和下标和下标

上界:数组某一维可用的最大下标。用Ubound 函数表示。

下界:数组某一维的最小下标。默认最小下标为0。用Lbound 函数表示。

下标;数组某一维的元素个数。

3、 调试数组方法调试数组方法::本地窗口本地窗口

4、 静态数组静态数组、、动态数组动态数组和多维数组和多维数组和多维数组

静态数组

静态数组:在定义数组时就确定维数和上下界的数组。如,Dim arrTemp(5) As Integer 动态数组

动态数组:在定义数组时未确定维数和上下界的数组。如,Dim arrTemp() As String

注意,在定义动态数组之后,必须使用ReDim 语句来设置动态数组的维数、上界和下界,为数组重新分配存储空间。否则,将出现运行错误,提示下标越界。

Sub test() Dim arrTemp(5) As Integer Stop End Sub Sub test()

Dim arrTemp() As Integer

★节点理论节点理论::数组维数可以根据本地窗口中节点直观得到,有几个节点就表示几维有几个节点就表示几维。。

多维数组

多维数组:维数大于一维的数组,最多可以定义60维的多维数组。 如,Dim arrTemp(1 to 3, 1 to 5) As Integer

根据节点理论,我们将多维数组引入『十八层地狱』概念:

三维以上的数组,跟我们的空间三维概念没有一点关系,维数只是层次概念。多少维数即表示多少节点(层)。

Sub test()

Dim arr(1 To 2, 1 To 3, 1 To 5) As Integer

Stop

End Sub 节点 (上界)最大下标Ubound

(下界)最小下标Lbound

注意,

只有在最底层才有数值。

因为单元格区域无法直接使用三维以上数组,一般很少使用。

5、 常用常用数组数组数组函数函数函数

1 Lbund Lbund()()()//Ubound Ubound()()()函数函数函数 分别用来确定数组某一维的上界和下界值。

使用形式如下:

UBound(arrayname[, dimension])

LBound(arrayname[, dimension])

其中:

:必需的。数组变量的名称,遵循标准变量命名约定。

:可选的;一般是整型常量或变量。指定返回哪一维的上界。1 表示第一维,2 表示第二

2 Array Array()()()函数函数函数 语法:Array(arglist)

说明:所需的 arglist 参数是一个用逗号隔开的值表,这些值用于给 Variant 所包含的数组的各元素赋值。如果不提供参数,则创建一个长度为0的数组。

Array 函数可方便地对数组整体赋值,但它只能赋值给声明为变体变量或变体变量的数组。赋值后的数组大小由赋值的个数决定。

3Split Split()()()函数函数函数 语法:SPLIT(expression[, delimiter[, limit[, compare]]]

说明:使用Split 函数可从一个字符串中,以某个指定符号为分隔符,分离若干个子字符串,得到一个下标从零开始的一维数组。

4Join Join()()()函数函数函数 语法:JOIN(sourcearray[, delimiter])

说明:返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。与Split 函数为反向操作,sourcearray 参数必须为一维数组。

Sub test()

Dim arrTemp(1 To 10, 2 To 5) As String

Debug.Print LBound(arrTemp, 1)

Stop

Debug.Print UBound(arrTemp, 2)

Stop

End Sub

Sub test()

Dim arrTemp() As String

arrTemp = Split("E.X.C.E.L", ".")

Stop

Sub test()

Dim arrTemp As Variant 'Dim arrTemp() As Variant

arrTemp = Array("E", "X", "C", "E", "L")

Stop

End Sub

○5Filter Filter()()()函数函数函数

6Index Index()()()函数函数函数 语法:INDEX(array,row_num,column_num)

说明:使用Index 返回1个数或1个一维数组。参数array 应为2维以下数组。

以下2组函数为工作表函数

组函数为工作表函数:: ○

7S UM UM()()()函数函数函数 语法:SUM(number1,number2, ...)

说明:number1, number2, ... 为 1 到 30 个需要求和的参数,其中,参数可以为数组。

Sub test()

Dim strJoin As String

strJoin = Join(Array("a", "b", "c"), ",")

Stop

End Sub

Sub test()

Dim arr(1 To 3, 1 To 10) As Integer

Dim i As Integer, j As Integer

Dim arrDim1 As Variant

For i = 1 To 3

For j = 1 To 10

arr(i, j) = i * j

Next

Next

arrDim1 = Application.Index(arr, 1)

Stop

arrDim1 = Application.Index(arr, , 2)

Stop

End Sub

Sub test()

Dim arr(1 To 3, 1 To 10) As Integer

Dim i As Integer, j As Integer

Dim sngSUM As Single

For i = 1 To 3

For j = 1 To 20

arr(i, j) = i * j

Next

Next

sngSUM = Application.Sum(arr)

8MAX MAX()()()/MIN /MIN /MIN()()()// AVERAGE AVERAGE()()()函数函数函数 说明:类似SUM 函数。

数组同样可以运用于工作表数学函数和统计函数,条件是参数可以为数组形式,如下函数:

数学函数:SUMPRODUCT 数组间元素乘积之和

统计函数:STDEV 样本的标准偏差、FREQUENCY 频率

6、 ReDim 和ReDim Preserve 语句语句

我们可以根据需要使用ReDim 语句反复地改变动态数组的上、下界或维数。使用ReDim 之后,将清除所有元素。

与ReDim 不同的是,使用了ReDim Preserve,只能通过改变动态数组最末维数的上界来改变数组的大小,且不能改变数组维数。即,如果已经用ReDim 定义了数组,则不能使用ReDim Preserve 改变了下界或维数,否则就会出现运行错误信息:下标越界。

Sub test()

Dim arrTemp() As Integer

Dim i As Integer

ReDim arrTemp(1 To 3, 1 To 5)

For i = 1 To 5

ReDim Preserve arrTemp(1 To 3, 1 To 5, 1 To i)

arrTemp(1, i) = i

Sub test()

Dim arrTemp() As Integer

ReDim arrTemp(1 To 3, 1 To 5)

Stop

End Sub

Sub test()

Dim arr(1 To 3, 1 To 10) As Integer

Dim i As Integer, j As Integer

Dim lMAX As Long, lMIN As Long, lA VERAGE As Long

For i = 1 To 3

For j = 1 To 10

arr(i, j) = i * j

Next

Next

lMAX = Application.Max(arr)

lMIN = Application.Min(arr)

lA VERAGE = Application.Average(arr)

Debug.Print "lMAX:" & lMAX, "lMIN:" & lMIN, "lAVERAGE:" & lA VERAGE

Stop

End Sub

7、 释放数组释放数组::Erase 语句

在某些情况下,我们需要释放数组来重新定义数组,或避免数据堆栈内存。

Erase 语句重新初始化大小固定的数组元素,以释放动态数组的存储空间。

Erase 对静态数组和动态数组处理方式不同。对静态数组将保留所有元素个数,参考表1。而对动态数组,将清除所有元素,包括维数。因此,在下次引用该动态数组之前,必须使用 ReDim 语句来重新定义该数组变量的维数。

表1:

数组类型数组类型

对元素的影响对元素的影响 数值类型数组

将元素值置0 字符类型数组(变长)

将元素值设为空字符串 字符类型数组(定长)

将元素值置0 变体类型数组

将元素值设为Empty 用户定义类型数组

将元素设为单独的变量 对象数组 将元素值设为Nothing

8、 数组与Excel 单元格区域单元格区域

使用变体变量Variant 单元格区域值或给单元格区域赋值

9、 数组的优势与不足数组的优势与不足

数组的速度优势是明显的,但不足也很明显,因为,数组处理的都是数据,因此,它不能给数据添加颜色等等。

Sub test()

Dim arrTemp1(1 To 100) As String

Dim arrTemp2() As Integer

ReDim arrTemp2(1 To 3) As Integer

Erase arrTemp1

Stop

Erase arrTemp2

Stop

End Sub

Sub test() Dim vArr1 As Variant vArr1 = Range("A1:C3") Stop Range("A5:C7") = vArr1 Stop End Sub

二、数组数组进阶进阶进阶用法用法用法

1、 数组数组非常用法非常用法非常用法

数组可以用Variant 变体变量获取一组单元格值,公式等,不包括单元格地址:

数组整体表示法:

用中括号大括号表示数组,分号表示维数:

2、 数组传递数组传递

对于给定的2个静态数组不能相互赋值,否则将出现编译错误:不能给数组赋值。如:

只能将静态数组赋值给动态数组或一个变体变量

Sub test()

Dim arr As Variant

arr = Range("A1:C10")

Stop

arr = Range("A1:C10").Formula

Stop

arr = Range("A1:C10").FormulaR1C1

Stop

End Sub

Sub test()

Dim arr() As Variant

arr = Array(1, 2, 3)

Stop

arr = [{1,2,3}]

Stop

arr = [{1,2,3;2,4,6}]

Stop

End Sub

Sub test()

Dim arr1(1) As Integer

Dim arr2(1) As Integer

arr1(0) = 1: arr1(1) = 2

arr2 = arr1

End Sub

Sub test()

Dim arr(1) As Integer

Dim arr2() As Integer

Dim arr3 As Variant

ReDim arr2(1)

arr1(0) = 1: arr1(1) = 2

arr2 = arr

arr3 = arr

Stop

End Sub

通过自定义函数传递数组

Sub test()

Dim vArr() As Long

Dim lLen As Long

vArr = arrTemp

Stop

End Sub

Function arrTemp() As Long()

Dim arr(100000) As Long

arrTemp = arr

End Function

通过类模块传递数组

‘Class Name: CArray

Public arr As Variant

‘-------------------------------------------- ‘Module

Sub test()

Dim arrTemp(2) As Integer

Dim arrClass As New CArray

arrTemp(0) = 5

arrClass.arr = arrTemp

End Sub

3、 数组嵌套数组嵌套

形式一:

根据节点理论,我们知道有几个节点就表示几维数组,但我们这里arr2的定义是一维数组,是不是说节点理论是错误的呢,arr2是二维数组呢?

这种现象其实就是数组嵌套。arr2 数组还是一维数组,

形式二:

Sub test()

Dim arr1(3) As Integer

Dim arr2(1) As Variant

Dim i As Integer

For i = 0 To 3

arr1(i) = i

Next

arr2(0) = arr1

arr2(1) = arr1

Stop

End Sub

Sub test()

Dim vArr As Variant

vArr = Array(Array(1, 2, 3), Array(4, 5, 6))

Stop

End Sub

三、数组

陷阱”

“陷阱

数组“

1、运行时错误"10":该数组被固定或暂时锁定

该数组被固定或暂时锁定:动态数组与TYPE、Erase、With、Exit For语句

Type Student

FirstName As String

End Type

Sub Array_Locked_Limit()

Dim Students() As Student

Dim i As Integer

ReDim Students(1 To 5) As Student

For i = 1 To 5

With Students(i)

.FirstName = "Excel" & i

If i = 3 Then Exit For

End With

Next

Erase Students

End Sub

Sub Array_Locked_Solve()

Dim Students() As Student

Dim i As Integer

ReDim Students(1 To 5) As Student

For i = 1 To 5

Students(i).FirstName = "Excel" & i

If i = 3 Then Exit For

Next

Erase Students

End Sub

2、用户定义类型的静态数组限制

编译错误:

局部的非静态变量太多

定长或静态数据不能超过64K

Type UDTs

sTemp(8158) As String 'UDT_Solve

' sTemp1(8159) As String 'UDT_Limit1 (8159 <= i <=16377)局部的非静态变量太多' sTemp2(16378) As String 'UDT_Limit2 (i >=16378 ) 定长或静态数据不能超过64K

End Type

Sub UDT_Limit1()

Dim arr As UDTs

arr.sTemp1(0) = "Excel"

End Sub

Sub UDT_Limit2()

Dim arr As UDTs

arr.sTemp2(0) = "Excel"

End Sub

Sub UDT_Solve()

Dim arr As UDTs

arr.sTemp(0) = "Excel"

End Sub

3、数组元素字符传递限制

○1方法’ _defult’ 作用于对象’Range’时失败

Sub String_Range_Limit()

Dim arrTemp(1 To 2) As String

arrTemp(1) = String(1000, "A")

arrTemp(2) = String(2000, "B")

Range("A1:B1") = arrTemp

End Sub

Sub String_Range_Solve()

Dim arrTemp(1 To 2) As Variant

arrTemp(1) = String(1000, "A")

arrTemp(2) = String(2000, "B")

Range("A1:B1") = arrTemp

End Sub

○2字符长度限制1823字符数

Sub String_Len_Solve()

Dim arrTemp(1 To 2) As Variant

arrTemp(1) = String(1000, "A")

arrTemp(2) = String(2000, "B")

Range("A1") = arrTemp(1)

Range("B1") = arrTemp(2)

End Sub

4、MIN/MAX与日期“陷阱”

Sub Date_Limit()

Dim arrDate(1 To 2) As Date

arrDate(1) = "2008-08-08"

arrDate(2) = Date

Debug.Print Application.Max(arrDate)

Stop

End Sub

Sub Date_Solve()

Dim arrDate(1 To 2) As Date

arrDate(1) = "2008-08-08"

arrDate(2) = Date

Debug.Print Format(Application.Max(arrDate(1), arrDate(2)), "yyyy-mm-dd") Stop

End Sub

Sub Date_Solve2()

Dim arrDate(1 To 2) As Date

Dim arr(1 To 2) As Double

arrDate(1) = "2008-08-08"

arrDate(2) = Date

arr(1) = arrDate(1)

arr(2) = arrDate(2)

Debug.Print Format(Application.Max(arr), "yyyy-mm-dd")

Stop

End Sub

5、运行时错误"7":内存溢出

以本机电脑为例,1G内存,Intel E4600 2.4G

定义一个78970000元素的String数组,将占用大约300M的内存空间。

Dim arr(1 To 78970000) As String

通过测试,Windows给Excel分配的空间大概是330M左右的内存。

6、内存泄漏

每大约10000个元素,将造成40K的内存泄漏

Sub RAM_Limit()

Dim iLen As Long

Dim vReturn As Variant

iLen = UBound(RAM_Consume())

End Sub

Sub RAM_Solve()

Dim iLen As Long

Dim vReturn As Variant

vReturn = RAM_Consume()

iLen = UBound(vReturn)

End Sub

Function RAM_Consume() As Long()

Dim arrTemp(10000) As Long

RAM_Consume = arrTemp

End Function

7、运行时错误"451":Property Let过程未定义,Property Get过程未返回对象

‘Class Name: CArray

Public arr As Variant

‘--------------------------------------------

‘Module

Sub Property_Error()

Dim arrTemp(2) As Integer

Dim arrClass As Object

Set arrClass = New CArray

arrTemp(0) = 5

arrClass.arr = arrTemp

Debug.Print arrClass.arr(0)

End Sub

Sub Property_Solve1()

Dim arrTemp(2) As Integer

Dim arrClass As Object

Set arrClass = New CArray

arrTemp(0) = 5

arrClass.arr = arrTemp

Debug.Print arrClass.arr()(0)

End Sub

Sub Property_Solve2()

Dim arrTemp(2) As Integer

Dim arrClass As CArray

Set arrClass = New CArray

arrTemp(0) = 5

arrClass.arr = arrTemp

Debug.Print arrClass.arr(0)

End Sub

8、Transpose 转置限制

限制256个字符

Sub Transpose1_Limit()

Dim arr() As Variant

Range("A1:B1") = Array("A", String(256, "B"))

arr = Range("A1:B1")

Range("A3:A4") = Application.Transpose(arr)

End Sub

Sub Transpose1_Solve()

Dim arr() As Variant

Range("A1:B1") = Array("A", String(256, "B"))

arr = Range("A1:B1")

Range("A3:A4") = TransposeDim(arr)

End Sub

Function TransposeDim(vArrTrans As Variant) As Variant Dim X As Long, Y As Long

Dim XUpper As Long, YUpper As Long

Dim XLower As Long, YLower As Long

Dim tempArray As Variant

XUpper = UBound(vArrTrans, 2)

XLower = LBound(vArrTrans, 2)

YUpper = UBound(vArrTrans, 1)

YLower = LBound(vArrTrans, 1)

ReDim tempArray(XLower To XUpper, YLower To YUpper)

For X = XLower To XUpper

For Y = YLower To YUpper

tempArray(X, Y) = vArrTrans(Y, X)

Next Y

Next X

TransposeDim = tempArray

End Function

四、数组数组应用进阶应用进阶应用进阶

1、 判断数组是否为空

2、 判断数组维数

参见:Inside Array.xls MDimArray 模块

3、 数组排序

参见:SortingExamples.xls 作者:Ole P. Erlandsen

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long

Function IsArrayEmpty(vArr() As Variant) As Boolean

IsArrayEmpty = IIf(SafeArrayGetDim(vArr) > 0, False, True)

End Function

Sub test()

Dim arr1

Dim arr2()

Dim arr3(1 To 2)

Debug.Print IsArrayEmpty(arr1)

Stop

End Sub

VBA语法

VBA语法技巧 数据类型 “数据类型”是指如何将数据存储在内存中。(1)Boolean 表示逻辑数据,可以是True或False中的任一个值。占用2字节的存储空间,取值范围为True 或False,缺省值为False。 (2)Byte 只能表示正数。占用1字节的存储空间,取值范围为0-255,缺省值为0。 (3)Currency 一种保存货币值数据的特殊数字格式。占用8字节的存储空间,取值范围为-922337203685477.5808-922337203685477.580 7,缺省值为0。 (4)Date 一种用于表示日期或时间的专用格式。占用8字节的存储空间,取值范围为100年1月1日——9999年12月31日,缺省值为00:00:00。 (5)Decimal 一种包含以10的幂为刻度的十进制数的变体子类型,只能通过CDec转换函数创建,不是一种独立的数据类型。占用14字节的存储空间,取值范围为 ±79228162514264337593543950335(不带小数点)或±7.9228162514264337593543950335(带28位小数点),缺省值为0。 (Decimal数据类型是在Excel 2000中引入的,在以前的版本中不能使用这种数据类型。该数据类型非常特殊,因为不能实际声明它,它是Variant的子类型,必须使用CDec函数将一个变量转换为Decimal数据类型) (6)Double 存储双精度浮点数,占用8字节的存储空间,取值范围为负值: -1.79769313486232E308——4.94065645841247 E-324,正值: 1.79769313486232E308——4.94065645841247E -324,缺省值为0。 (7)Integer 表示从-32768-32767之间的整数,其中一位表示符号,占用2字节的存储空间,缺省值为0。 (8)Long 表示存储为4个字节空间的带符号的数,其中一位表示符号,取值范围为 -2147483648-2147483647,缺省值为0。 (9)Object 包含对某个对象的引用(地址),占用4字节的存储空间,可对任何对象引用,缺省值为Nothing。 (10)Single 表示分数、带小数位或指数的数值等单精度数,占用4字节的存储空间,取值范围为负值: -3.402823E38——1.401298E-45,正值: 1.401298E-45——3.402823E38,缺省值为0。 (11)String 可声明定长和变长的String数据类型。其中,定长的String数据类型占用的存储空间为字符串的长度,取值范围为1——65400个字符,缺省值等于该字符串长度的空格数。变长的 String数据类型能动态地加长或缩短以存储要求的字符串数,占用的存储空间为10字节加上

Excel VBA编程 数组函数

Excel VBA编程数组函数 在程序中,根据实际情况,需要判断某个变量是否为数组,或者数组的下标范围,可以使用系统提供的函数来进行这些操作。下面分别介绍这些函数。 1.检测数组下标 利用Lbound与Ubound函数,可以返回指定数组中的最小或最大下标,即数组中的最小值和最大值。 格式:Lbound/Ubound(<数组名>[,<数组维序号>]) 函数值为数组某维的下界(Lbound)或上界(Ubound),类型为Long,其中数组维序号为可选项,表示数组的指定维号,默认为1。 例如,显示数组中的数组元素,如图5-14所示。 显示 图5-14 显示的结果 其代码如下: Sub 显示数组() Dim A(-1 To 50, 10 To 30, -13 To 4, -5 To 15) '显示最小下标 Debug.Print "第一维数组最小下标:" & LBound(A, 1) Debug.Print "第二维数组最小下标:" & LBound(A, 2) Debug.Print "第三维数组最小下标:" & LBound(A, 3) Debug.Print "第四维数组最小下标:" & LBound(A, 4) '显示最大下标 Debug.Print "第一维数组最大下标:" & UBound(A, 1) Debug.Print "第二维数组最大下标:" & UBound(A, 2) Debug.Print "第三维数组最大下标:" & UBound(A, 3) Debug.Print "第四维数组最大下标:" & UBound(A, 4) End Sub 2.判断数组 在实际应用中,数组和变量的区分不是很清晰,特别是定义的动态数组和变量更加难以区分。为此VBA提供了isarray函数来判断是否是数组。 格式:isarray(变量名) 其值为逻辑型,指出指定的变量是否为一个数组.是则值为true,否则为false。 例如,声明数组s和变量a,b,判断其是否数组,其代码如图5-15所示。

VBA数组进阶

VBA 数组进阶 ————进阶即为进阶即为进阶即为探寻探寻探寻细节细节细节,,“实践出真知实践出真知”” 。 此篇献给探索VBA 和所有关心我们地球家园的朋友们! 此篇版权归https://www.wendangku.net/doc/2215588187.html, 和https://www.wendangku.net/doc/2215588187.html, 网站 欢迎大家转载,但请保留出处 HOmT398 2009.4.18于北京

一、数组数组基本概念基本概念基本概念 1、 什么是数组什么是数组 数组是一组数。 数组是一组有序列的数。 数组是一组连续可索引的具有相同内在数据类型的元素所成的集合,在未指定为变体变量情况下。 2、 上界上界、、下界下界和下标和下标和下标 上界:数组某一维可用的最大下标。用Ubound 函数表示。 下界:数组某一维的最小下标。默认最小下标为0。用Lbound 函数表示。 下标;数组某一维的元素个数。 3、 调试数组方法调试数组方法::本地窗口本地窗口 4、 静态数组静态数组、、动态数组动态数组和多维数组和多维数组和多维数组 静态数组 静态数组:在定义数组时就确定维数和上下界的数组。如,Dim arrTemp(5) As Integer 动态数组 动态数组:在定义数组时未确定维数和上下界的数组。如,Dim arrTemp() As String 注意,在定义动态数组之后,必须使用ReDim 语句来设置动态数组的维数、上界和下界,为数组重新分配存储空间。否则,将出现运行错误,提示下标越界。 Sub test() Dim arrTemp(5) As Integer Stop End Sub Sub test() Dim arrTemp() As Integer

Excel VBA数组基础

Excel VBA数组基础 数组为可以存储多个数据的变量。 声明数组 Dim myArray(2) 声明一个含有3个元素的数组,即myArray(0)、myArray(1)、myArray(2) Option Base 1 Dim myArray(2) As Integer 声明一个含有2个元素的数组,即myArray(1)、myArray(2),数据类型为Integer型。Option Base语句用来改变数组的下界,指定数组基数从1开始。 Dim myArray(1 To 10) 声明一个含有10个元素的数组,数组基数从1开始。这是另一种改变数组下界的方法,即在定义数组的同时,指定数组的上界和下界。 Dim myArray(1 To 10, 1 To 20) 声明一个10行20列的数组。 获取数组的下界和上界 LBound函数:获取数组的下界 UBound函数:获取数组的上界 说明: ●UBound函数返回数组的上界,数组中实际的元素个数取决于其下界。如果使用缺 省下界值0,UBound函数返回的值比数组实际元素个数小1。例如,如果数组变量 myArray有10个元素且下界为0,那么UBound(myArray)返回值为9,因此数组中 元素的总数应为:UBound(myArray)+1 如果下界设置为1,那么UBound函数的返回值就等于数组的实际元素数。 因此,在确定数组元素个数时,要同时使用UBound函数和LBound函数才能确保 结果正确: UBound(myArray)-LBound(myArray)+1 ●在使用UBound函数之前,数组应该初始化,否则会导致“下标越界”错误。 ●可以对多维数组使用UBound函数,但需要指定数组中的一个维数。若不指定维数, 默认为第1维。 上界:UBound(myArray,dimensionNo) 下界:LBound(myArray,dimensionNo) 给数组赋值

如何在vba中声明数组

声明数组 什么是数组:连续可索引的具有相同内在数据类型的元素所成的集合,数组中的每一元素具有唯一索引号。更改其中一个元素并不会影响其它元素。 数组的声明方式和其它的变量是一样的,它可以使用Dim、Static、Private 或Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。数组是否从0 或 1 索引是根据Option Base 语句的设置。如果Option Base 没有指定为 1,则数组索引从零开始。 声明固定大小的数组 下面这行代码声明了一个固定大小的数组,它是个11 行乘以11 列的Integer 数组: Dim MyArray(10, 10) As Integer 第一个参数代表的是行;而第二个参数代表的是列。 与其它变量的声明一样,除非指定一个数据类型给数组,否则声明数组中元素的数据类型(数据类型:变量的特性,用来决定可保存何种数据。数据类型包括Byte、Boolean、Integer、Long、Currency、Decimal、Single、Double、Date、String、Object、Variant ( 默认) 和用户定义类型等。)为Variant。数组中每个数组的数字型Variant 元素占用16 个字节。每个字符串型Variant 元素占用22 个字节。为了尽可能使写的代码简洁明了,则要明确声明的数组为某一种数据类型而非Variant。下面的这几行代码比较了几个不同数组的大小: ' 整型数组使用22 个字节(11 元素* 2 字节) ReDim MyIntegerArray(10) As Integer ' 双精度数组使用88 个字节(11 元素* 8 字节)。 ReDim MyDoubleArray(10) As Double ' 变体型数组至少使用176 字节(11 元素* 16 字节)。 ReDim MyVariantArray(10) ' 整型数组使用100 * 100 * 2 字节(20,000 字节)。 ReDim MyIntegerArray (99, 99) As Integer ' 双精度数组使用100 * 100 * 8 字节(80,000 字节)。 ReDim MyDoubleArray (99, 99) As Double ' 变体型数组至少使用160,000 字节(100 * 100 * 16 字节)。 ReDim MyVariantArray(99, 99) 数组变量的最大值,是以的操作系统与有多少可用内存为基础。若使用的数组大小超过了系统中可用内存总数的话,则速度会变慢,因为必须从磁盘中读写回数据。 声明动态数组 若声明为动态数组,则可以在执行代码时去改变数组大小。可以利用Static、Dim、Private 或Public 语句来声明数组,并使括号内为为空,如下示例所示。 Dim sngArray() As Single

VBA中的控件数组

VBA中的控件数组 2009年2月28日 评论发表评论 大家都知道,和VB不一样,VBA中不能直接创建控件数组。然而可以使用WithEvents来模拟相同的功能。我们需要一个类来处理控件的事件,而每一个控件需要一个类实例。对于不同控件的类实例,我们可以使用一个对象数组或者集合来实现。 这里使用按钮控件做为例子来介绍怎样在窗体和工作表中创建控件数组。 创建类 创建控件数组之前,我们需要一个类来处理控件的事件。 在VBE窗口中,单击菜单“插入”->“类模块”,在属性窗口中将类的名称改为“cCB”。 在类模块中添加下面这一行: Private WithEvents m_CB As https://www.wendangku.net/doc/2215588187.html,mandButton 这样你就可以从代码栏的顶部左边下拉列表中选择m_CB并选择右边下拉列表中相应的事件。 完整的代码如下: Private WithEvents m_CB As https://www.wendangku.net/doc/2215588187.html,mandButton ' 初始化,将控件绑定到类 Public Sub Init(ctl As https://www.wendangku.net/doc/2215588187.html,mandButton) Set m_CB = ctl End Sub ' 控件的Click事件 Private Sub m_CB_Click() MsgBox "你点击了:" & m_CB.Caption End Sub ' 注销类 Private Sub Class_Terminate() Set m_CB = Nothing End Sub

窗体中的控件数组 然后创建一个窗体,在窗体中添加两个CommandButton,将这两个按钮控件分别命名为cmd1和cmd2,然后在窗体中的初始化事件中添加代码如下: Private ctlCB(1 To 2) As cCB ' 以对象数组保存类的实例 Private Sub UserForm_Initialize() Set ctlCB(1) = New cCB ' 将按钮cmd1赋给类的实例 ctlCB(1).Init cmd1 Set ctlCB(2) = New cCB ctlCB(2).Init cmd2 End Sub 这里使用对象数组ctlCB(1 to 2)来保存类实例。每当使用Set语句创建一个类实例,然后使用类的Init方法将按钮控件赋给这个实例。 也可以使用集合来保存这个类的实例。代码如下: Private colCB As New Collection Private ctlCB As cCB … 以集合保存类的实例 Private Sub UserForm_Initialize() Set ctlCB = New cCB ' 将按钮cmd1赋给类的实例 ctlCB.Init cmd1 ' 将类的实例加入到集合中 colCB.Add ctlCB Set ctlCB = New cCB ctlCB.Init cmd2 colCB.Add ctlCB End Sub

vba中生成数组的[ ]与array 转

vba中生成数组的[ ]与array 转 看一贴中问[ ]与array,在此简说下: 一、array 是返回一个一维数组,其最小下标受Option Base 语句指定的下界的决定是0还是1(但vba.array不受此限定)示例:a =Array(1, 2, 3, 4) '在Option Base 0或默认情况下,a是个最小下标为0的一维数组 a =Array(1, 2, 3, 4) '在Option Base 1情况下,a是个最小下标为1的一维数组 a =vba.Array(1, 2, 3, 4) '不管Option Base指定的是什么,a都是个最小下标为0的一维数组 如果要用array返回一个二维数组,得先生成一个数组元素为数组的一维数组然后再转一转,如: a = Application.Transpose(Array(Array(1, 2), Array(3, 4))) 'a是一个二维数组,但注意他的元素顺序 其中Array(Array(1, 2), Array(3, 4))产生的就是一个数组元素为数组的一维数组 二、[ ] 功能与evaluate差不多(evaluate可以用变量,而[ ]不能)。他也可以返回数组,但与array不同的是:最小下标不受Option Base 语句指定的下界的决定,都是1;不但可以返回

一维数组也可以返回二维数组。如下示例: a = [{1,2,3,4}] 'a是一个最小下标为1的一维数组 a = [{1,2;3,4}] 'a是一个二维数组,是不是比array要方便一些?但注意其元素的顺序与前面的不同哈 同时,他还可以进行些计算,如 a = [{1,2;3,4}+5] '可以这样,可以去看看结果中各元素是怎样的 a = [{1,2;3,4}&"可以"] '这样也行 a = [{1,2;3,4}&{"a","b";"c","d"}] '同样这样还是可以 这是不是就是与单元格中输入公式并选中一些地方后按F9所看到的差不多? 它除了与数组而外,还有: MsgBox [sum(a1:b4)] '假设当前表的a1:b4中为数字,这样就求和了 与 MsgBox Evaluate("sum(a1:b4)")、MsgBox WorksheetFunction.Sum(Range("a1:b4")) 功能都是一样的,只是写起来是不是简单多了?但快不快就不晓得哈 总之,就一句话:在单元格中可以怎样整的在VBA中就用[ ]怎样整就成了但此贴不是鼓吹使用[ ]而不用array哈,各有千秋嘛。哈哈

Excel_VBA数组入门教程集合

Excel VBA数组入门教程集合 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中 Next y Next x MsgBox arr(4, 3) '根据提供的行数和列数显示数组 arr(1, 2) = "我改一下试试" '你可以随时修改数组内指定位置的数据 MsgBox arr(1, 2) End Sub 总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素 3. 把单元格数据搬入内存: 一、声明: Dim arr as Variant '声明一个变量,不能声明其他数据类型 Dim arr(1 to 10, 1 to 2) , 这种声明也是错误的,固定大小的VBA数组是不能一次性装入单元格数据 或:dim arr()这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组。 二、装入 arr =range("a9:c100") '装入很简单,变量 = 单元格区域 三、读出 装入数组后的单元格数值,可以按数组名称(行数,列数) 直接读取该位置的值,如下面的代码。 Msgbox arr(3,2) '就可以取出搬过去的而构成的数组第3行第2列的内容 四、示例 Sub s3() Dim arr() '声明一个动态数组(动态指不固定大小) Dim arr1 '声明一个Variant类型的变量

VBA数组学习笔记

[分享]VBA数组学习笔记 VBA数组学习笔记 常常在论坛看到很多VBA高手运用数组解决各种问题,速度快,代码简洁,很是羡慕,所以逐渐收集了一些资料,与大家分享,也请多多指教。在此,也向高手们致以谢意。 一、数组的分类 按元素数目分:元素数目大小固定的数组和元素数目大小不固定的动态数组。 按维数分:一维数组、多维数组。 Arr(1 to 12)、Arr1(0 to 24)----一维固定数组; Arr2(1 to 5,1 to 8)---- 二维固定数组; Arr3(5 to 10,6 to 12,1 to 100) ---- 三维固定数组。 动态数组 Dim Arr2(),r% r=r+1 ReDim Preserve Arr2(1 To r) ―――动态数组;可以重新声明(只有最后一维的数目才能重新声明); 用了关键字 Preserve 可确保原来包含数据的数组中的任何数据都不会丢失

二、数组的赋值 2.1,单元格区域保存到数组 arr = [e22:i24] arr=Range(“e22:i24”) 2.2,Array函数 myArray = Array("AAA", "BBB", 200, 500, "2006-7-12") 如果代码头没有 Option Base 1 的语句,则数组myArray的上限为4,下限为0。即下限LBound(myArr)=0 ,上限 UBound(myArr)=4 二维数组的第一维的上限:UBound(Arr,1) 二维数组的第二维的上限:UBound(Arr,2) 多维数组上限的求法一样。

2.3,把单元格区域公式赋给数组 如果a5=B4+1 arr = [a4:c8].Formula '将单元格绝对引用公式保存到数组[e4:g8]=arr 此时e5中的公式也=B4+1; 如果将单元格相对引用公式保存到数组 arr = [a4:c8].FormulaR1C1 如果a5=B4+1 [e4:g8]=arr 此时e5中的公式就=E4+1; 三、数组的处理 3.1,数组里的最大值和最小值 最大值aa = Application.WorksheetFunction.Max(Arr) aa= https://www.wendangku.net/doc/2215588187.html,rge(Arr,1) 最小值aa = Application.WorksheetFunction.Min(Arr)

EXCEL VBA数组 word版

EXCEL 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 a r r(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) 如果数组是多维的,只能动态声明第末维的,如果需要把让第一维不断扩充,还需要先转置, 有点麻烦,这里就不再详述,遇到这种情况,我们可以声明一个足够大的静态数组来取代动态数组,运行速度较前者快。

一些有用的在VBA中处理数组的函数

一些有用的在VBA中处理数组的函数 Array函数 Array函数是一种使用值创建和填充数组的方法。将所有的值作为参数传递给该函数,返回一个使用这些值作为元素的一维数组,数组值的顺序和传递给函数的数值的顺序相同。第一个元素的索引值总是0,不依赖任何Option Base设置。 Sub TestArray() Dim myArray() As Variant '从逗号分隔的字符串列表中创建数组 myArray = Array("One", "Two", "Three") '显示数组元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2) '也可以使用数值作为参数 myArray = Array(10, 20, 30) '显示数组元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)

End Sub Array函数总是返回Variant类型的数组,但元素的数据类型可以不同,取决于传递给该函数的数值的类型。 例如,Array(“One”, 2, 3.4)返回的数组,第一个元素是String类型,第二个元素是Integer型,最后一个元素是Double型。 如果没有传递参数给Array函数,那么将返回一个空数组。此时,数组的上界为-1,小于下界(总为0)。例如, UBound(Array()) 将返回-1。 更多内容参见:Array函数。 Split函数 如果所有的值都不是分开的,而是在一个字符串中,那么可以使用Split函数分开它们并创建一个一维字符串数组。同样,结果数组的索引值总是以0开始。 可以指定字符串中分离值的分隔符,例如,逗号或分号。如

关于EXCEL中VBA的数组理解

关于EXCEL中VBA的数组理解 一、什么是VBA数组 不要把VBA数组想的太神秘,它其实就是一组数字而已。把一组数按行、列排在一起,放在存中。就是一个VBA数组。 二、数组的维数 数组的维数其实和文件管理的目录一样的,只有一层时就是一维。如果有两层则是二维数组(有行有列为二维),如果有三层,则是三维数组。。VBA中支持1~3维数组运算。 Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中 Next y Next x

MsgBox arr(4, 3) '根据提供的行数和列数显示数组 arr(1, 2) = "我改一下试试"'你可以随时修改数组指定位置的数据 MsgBox arr(1, 2) End Sub 总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素 三、把单元格数据搬入存: 一、声明: Dim arr as Variant '声明一个变量,不能声明其他数据类型Dim arr(1 to 10, 1 to 2 ) , 这种声明也是错误的,固定大小的VBA数组是不能一次性装入单元格数据 或:dim arr() 这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组。 二、装入 arr =range("a9:c100") '装入很简单,变量= 单元格区域 三、读出

VBA数组

VBA数组基础学习 一、数组概念 二、数组就是一个列表或者一组数据表。它是由连续可索引的具有相同内在数据类型的元素所组成的集合,数组中每一个元素都具有唯一的索引号。更改其中一个元素并不会影响到其它元素。 数组存在内存,可以利用索引号获取该集合中每一个子集。 数组的两个特点: 1、读写速度快 VBA读取对象中的值永远慢于读取内存中的值。可以借助VBA数组对程序提速。 2、无法永远保存 数据存于工作表区域内,可以永久保存。但存入内存中的变量数组和常量数组却受其作用域影响生命周期。 过程级别的私有数组变量或者常量数组在过程结束后会自动释放,结束其生命周期; 而公有的变量数组和常量数组在excel应用程序关闭后会自动释放。也就是重新启动excel后,以前任何数组都不存在。 3、数组分类 按照数组元素是否固定来分,可以分为静态数组和动态数组; 按照数组维度来分,可以分为一维数组、二维数组等,最多只能为60维。 二、数组的维度 数组可以是一维、二维直到六十维。而对于excel工作表来说, excel的每一行或者每一列就可以转换成一维数组,而多行多列就可以转换成二维数组。 1、一维数组 在数组公式中,在A1:F1区域中输入数组公式:={1,2,3,4,5,6} ,然后按Ctrl+Shift+Enter,就可以在A1:F1之间得到了横向区域的值。 在A1:A6区域中输入数组公式:={1;2;3;4;5;6},然后按 Ctrl+Shift+Enter,就可以在A1:A6之间得到了纵向区域的值。 而VBA数组也可以得到同样的效果: 2.1 VBA 代码 Sub 横向数组() [A1:F1] = [{1,2,3,4,5,6}] End Sub [{1,2,3,4,5,6}]代表是一维横向数组。 2.2 VBA代码 Sub 纵向数组() [A1:A6] = [{1;2;3;4;5;6}] End Sub [{1;2;3;4;5;6}]代表是一维纵向数组。 从上面两个赋值过程来看,看到数组在VBA中的优势,不仅可以对单元格进行循环赋值,还可以把原本需要循环6次的操作集中一次完成。 2、二维数组

VBA.数组详解

Excel VBA数组入门教程(共10集) [日期:2011-08-07] 来源:excel精英培训作者:兰色幻想[字体:大中 小] 1.前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2.数组的维数: Sub数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中Next y Next x MsgBox arr(4, 3) '根据提供的行数和列数显示数组 arr(1, 2) = "我改一下试试"'你可以随时修改数组内指定位置的数据 MsgBox arr(1, 2) End Sub 总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素 3.把单元格数据搬入内存: 一、声明: Dim arr as Variant '声明一个变量,不能声明其他数据类型 Dim arr(1 to 10, 1 to 2 ) ,这种声明也是错误的,固定大小的VBA数组是不能一次性装入单元格数据 或:dim arr() 这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组。

arr =range("a9:c100") '装入很简单,变量=单元格区域 三、读出 装入数组后的单元格数值,可以按数组名称(行数,列数)直接读取该位置的值,如下面的代码。 Msgbox arr(3,2) '就可以取出搬过去的而构成的数组第3行第2列的内容四、示例 Sub s3() Dim arr() '声明一个动态数组(动态指不固定大小) Dim arr1 '声明一个Variant类型的变量 arr = Range("a1:c7") '把单元格区域A1:C7的值装入数组arr arr1 = Range("a1:c7") '把单元格区域A1:C7的值装入数组arr1 MsgBox arr(1, 1) '读取arr数组中第1行第1列的数值 MsgBox arr1(2, 3) '读取arr1数组的第2行第3列的数值 End Sub 4.把单元格数据搬入内存: 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

VBA入门43:数组4(一维数组和二维数组)

VBA入门43:数组4(一维数组和二维数组) 一维数组和二维数组的区别,很明显的就是维度不同。定义一个一维数组和一个二维数组,如下图,可以看出,brr 的两个维度brr(维度1,维度2),无论是一维数组还是二维数组,数组的数据大多是来源于单元格。1、数组的赋值1.1数据来自于单元格的(直接“=”),所形成的数组,都是二维数组, 无论该数组是否只有“一行”或者“一列”。 1.2除了这种直接读取单元格区域的赋值方法之外,数组还 可以使用循环读取单元格的数值,但这种方法效率太低,也没必要。如下,分别将数据用循环的方法写入一维数组和二维数组。2、数组数据写入单元格区域(工作表)如上图中 的arr和brr分别将数据重新输出到工作表可以看到,数组要求单元格区域的大小要和数组一样匹配。如果单元格区域的大小不匹配呢?这是数组规模大于单元格区域规模这是数 组规模小于单元格规模所以,用来存放数组数据的单元格区域的规模,一定是小于等于数组的规模。以数组的规模为准。 3、数组的大小(上界和下界)在Dim arr(1 To 8, 1 To 1),数组的大小可以这么理解,数组arr有两个维度第一个维度,下标是1,上标是8第二个维度,下标是1,上标是1所以,上界或者下界都是某个维度的最大值和最小值。读取数组某个维度的上下界限,可以使用Lbound和Ubound函数。如

下图,x = LBound(arr, 1),括号内arr为数组名称,1为其第一维度,读取的是数组arr第一维度的下标(最小值),如果1省略,默认为第一维度;y = LBound(arr, 2),括号内arr 为数组名称,2为其第二位度,读取的是数组arr第二维度的下标(最小值);UBound函数读取的是数组某个维度的上界(最大值),和LBound函数相对。数组维度的下限一般默认开始为0,但是如果是直接“=”单元格形成的数组,下限都是从1开始的。如下图什么时候数组的下界从0开始呢?3.1 定义数组从0开始一维数组:二维数组:3.2 字典、split函数等所生成的一维数组 无论数组的维度从神马开始,在Excel中,数组就是一个“工作表”。用行列来理解数组。Dim arr(1 To 8, 1 To 1):表示数组的大小是8行1列Dim brr(1 To 8):表示数组的大小是1行8列 4、一维数组和二维数组的转置一维数组可以转置为二维数组,二维数组可以转置为一维数组。如下图中,arr为二维数组,brr为一维数组,通过Transpose函数转置(类似于我们再Excel中的操作:转置)在输出数组的时候,一维数组如果要输出成为“一列”,需要转置,也就是将一维数组转置成为二维数组。二维数组可以直接“放置”再单元格区域当中,而不需要转置。假如不转置一维数组,直接输出到单元格区域。则单元格中只显示其第一个元素的值。建议一般

Vb(VBA)数组操作

Vb(VBA)数组操作 与Array()和Split()相比,由工作表区域创建数组更加直观而简易,一个等号便解决问题: 如:用Sheet2工作表A1:E83的数据创建一个数组: Private Sub CommandButton1_Click() arr = Sheet2.Range("a1:e83") End Sub 如果把该数据复制到Sheet1工作表相同区域,用数组操作,代码如下: Private Sub CommandButton1_Click() arr = Sheet2.Range("a1:e83") Range("a1:e83") = arr End Sub 共两句,前一句把数据保存到数组,第二句,把数组内容写入到工作表。 选择第3行代码,按F9设置断点。点击按钮运行代码,到该行,程序自动中断,此时,可从本地窗口中观察到运行结果,一个83行2列的数组已经创建。 Filter()函数在一维数组中搜索文本型数据,并把结果保存到指定的数组中。 A1单元格是以逗号分隔的姓名串,部分有重复,要求剔除其中重复的姓名,把不重复的姓名写入单元格A2向右的区域。 第一步,把所有姓名保存到数组xm()中; 第二步,建立一个数组Arr()保存结果,遍历xm()过程中,检查Arr()中是否存在当前的姓名,用命令: Temp = Filter(Arr, xm(i)) '在数组Arr()中搜索当前值xm(i),如果找到,结果保存到Temp()数组中,如果找不到,返回一个空的数组Temp() 根据Temp()数组的大小,可以知道当前值xm(i)是不是一个重复的值。 Split()把一个文本,根据指定的分隔符,建立一个数组。 看一个实例: 单元格A1中有一串姓名: 朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女),曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福要求:用Split(),把这串文本创建为一个数组: Sub test() XM = Split(Range("a1"), ",") End Sub 同样可以用本地窗口检查转换结果。 注意,Split()函数把文本转换成数组,并不受Option Base的影响,索引号总是从0开始。 有一个函数,是Split()的反向操作函数,把数组的元素连接成一个字符串,这个函数就是Join()。 在上例中,把要求改为,剔除重复值后,把结果依原样输出到A2单元格中。 我们只需改变最后一行代码: 把这一行: 'Range("a2").Resize(1, r) = Arr '填充到工作表 换成这一行,用上Join()函数,把Arr()数组中的元素用“,”连接成一个字符串: Range("a2") = Join(Arr, ",")

VBA数组入门

VBA数组入门 一、初识数组 1、数组就是一个列表或一组数据表。我们学习数组的目的,就是为了加速我们代码的效率。 2、我们如何运用数组呢? 首先,必须声明数组。 其次,给数组赋值,可以是经过一系列的运算后再赋值给数组。 最后,将数组返回到工作表区域中。最终的目的是在工作表中显示我们想要的结果。 3、调试数组的手段:本地窗口 我们可以通过设置Stop语句,或F8逐步执行代码,在本地窗口中观测数组的变化。 Sub test() Dim arrSheetName(5) As String Stop End Sub 4、数组的优势与不足 数组的速度优势是明显的,但不足也很明显,因为,数组处理的都是数据,因此,它不能给EXCEL 数据添加颜色,删除行列,插入行列等等动作。

5、VBA数组没有内存数组和一般数组之分。我们在声明数组时,就已经将数组写入内存里。 二、声明数组 1、声明一个数组变量,也是用Dim语句来声明。当声明了一个数组,便决定了这个数组用于存储数据所用的内存空间。 Dim arrCnt(10) As Integer Dim arrSheetName(5) As String Dim arr(7) As Variant 1)、这里我们看到,与一般定义不同的是多了个带括号的数字。这个数字,就是这个数组所能存储的最大元素数。 2)、数组可以根据我们的需要存储不同类型的数据,这与我们平常变量定义的类型一样,可以是Integer,Long,String,Variant 等等。 2、注意,上面定义数组的例子是静态数组,所以,我们在声明数组时,就决定了数组用于存储数据所用的内存空间大小。后面我们会讲到动态数组。 三、数组的上界和下界 1、VBA中,数组默认的下界是0,也就是Option Base 0 如果,我们习惯了用1作为我们的下界,可以强制声明:Option Base 1 注:Option Base 0(1)必须放在所有模块之前。 2、当然,我们也可以忽略这个强制声明,那我们就需要在声明数组时,指明数组的上界和下界,如:Dim arrSheetName(1 to 3) as String 表明这个数组的上下界分别是1和3。 四、静态数组和动态数组 我们之前所定义的数组,都是静态数组。静态数组的特点是具有大小的数组。当我们事先知道数组的大小,那么,我们可以直接声明为静态数组。 如果我们不知道数组大小,那么我们应定义成动态数组。 1、动态数组是可以改变大小的数组,通过在数组名称后附带空括号来声明,如: Dim arrSheetName() as String

Excel VBA数组入门教程范文

Excel VBA数组入门教程 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通过循环把单元格区域a1:c4的数据装进数组中 Next y Next x MsgBox arr(4, 3) '根据提供的行数和列数显示数组 arr(1, 2) = "我改一下试试" '你可以随时修改数组内指定位置的数据 MsgBox arr(1, 2) End Sub 总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR(4)表示数组中第4个元素

3. 把单元格数据搬入内存: 一、声明: Dim arr as Variant '声明一个变量,不能声明其他数据类型 Dim arr(1 to 10, 1 to 2 ) , 这种声明也是错误的,固定大小的VBA数组是不能一次性装入单元格数据 或:dim arr() 这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组。 二、装入 arr =range("a9:c100") '装入很简单,变量= 单元格区域 三、读出 装入数组后的单元格数值,可以按数组名称(行数,列数) 直接读取该位置的值,如下面的代码。 Msgbox arr(3,2) '就可以取出搬过去的而构成的数组第3行第2列的内容 四、示例 Sub s3()

相关文档