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
2、在定义动态数组之后,必须使用ReDim来设置动态数组的上界和下界,为数组重新分配存储空间。
3、我们可以使用ReDim语句反复地改变数组的元素已经维数。
Sub arr1()
Dim arr() As Long
Dim i As Long
ReDim arr(1 To 3)
For i = 1 To 3
arr(i) = i
Next
Sheet1.[a1].Resize(1, 3) = arr
Stop
ReDim arr(1 To 10)
For i = 1 To 10
arr(i) = i
Next
Sheet1.[a1].Resize(1, 10) = arr
End Sub
4、ReDim Preserve语句
Preserve 英文的意思是保留,保存。顾名思义,就是重新定义数组时,将数组元素保留在数组中。与ReDim不同的是,使用了ReDim Preserve,只能通过改变上界,即最末维的大小,来改变数组的大小,且不能改变数组维数。如果改变了下界,就会出现错误信息。
例子,见后面的过程Join2。
五、一维数组和多维数组
我们前面所举的例子都是一维数组,数组可以定义多达60维。
但我们很少看到多过2维的代码。这也是因为对于Excel的工作表来说,行和列,就是表示2维,我们处理的数据区域很多都是围绕行和列进行处理。因此,我们只要掌握的二维数组,就掌握了对Excel的数据处理。
下面通过2幅图来理解二维数组:
1、定义一个二维数组
Dim arrSource(1 to 100, 1 to 10) As Long
2、定义一个三维数组
Dim arrSource(1 To 10, 1 To 6, -1 To 5) As Long
注:我们可以通过节点的多少来判断数组维数。
六、数组函数
1、Array 函数
返回一个包含数组的 Variant。
Array函数在运行代码执行期间创建数组,而不必事先知道数组的大小。
Sub Array1()
Dim arr As Variant
arr = Array(1, 2, 3)
MsgBox arr(0)
End Sub
2、Lbound、Ubound函数
LBound 函数:
返回一个 Long 型数据,其值为指定的数组维可用的最小下标。
UBound 函数:
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。
Sub ULbound1()
Dim arr As Variant
arr = Array(1, 2, 3)
MsgBox UBound(arr)
MsgBox LBound(arr)
End Sub
Sub ULbound2()
Dim arr(1 To 100, 1 To 10, -1 To 3) As Integer
MsgBox UBound(arr, 1)
MsgBox UBound(arr, 2)
MsgBox LBound(arr, 3)
End Sub
3、Split函数
返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
语法:Split(expression[, delimiter[, limit[, compare]]])
expression必需的。包含子字符串和分隔符的字符串表达式。如果
expression是一个长度为零的字符串(""),Split则返回一个空
数组,即没有元素和数据的数组。
delimiter可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用
空格字符(" ")作为分隔符。如果delimiter是一个长度为零的字
符串,则返回的数组仅包含一个元素,即完整的 expression字符
串。
limit可选的。要返回的子字符串数,–1表示返回所有的子字符串。
compare可选的。数字值,表示判别子字符串时使用的比较方式。关于其值,
请参阅“设置值”部分。
Sub Split1()
Dim strJoin As String
Dim arrSplit As Variant
strJoin = "a,b,c"
arrSplit = Split(strJoin, ",")
Sheet1.[a1].Resize(1, 3) = arrSplit
End Sub
4、Join函数
返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。
语法:Join(sourcearray[, delimiter])
sourcearray必需的。包含被连接子字符串的一维数组。
delimiter可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格(" ")来分隔子字符串。如果delimiter是零长度字符串(""),则列表中的所有
项目都连接在一起,中间没有分隔符。
Sub Join1()
Dim strJoin As String
strJoin = Join(Array("a", "b", "c"), ",")
MsgBox strJoin
End Sub
5、Filter函数
返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。
语法:Filter(sourcesrray, match[, include[, compare]])
sourcearray必需的。要执行搜索的一维字符串数组。
match必需的。要搜索的字符串。
include可选的。Boolean值,表示返回子串包含还是不包含match字符串。
如果include是True,Filter返回的是包含match子字符串的数
组子集。如果include是False,Filter返回的是不包含match
子字符串的数组子集。
compare可选的。数字值,表示所使用的字符串比较类型。有关其设置,请
参阅下面的“设置值”部分。
‘查找2数组的差集
Sub Filter1()
Dim varArr1 As Variant
Dim varArr2 As Variant
Dim i As Integer
varArr2 = Array(1021, 1023, 1025)
varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)
For i = 0 To UBound(varArr2)
varArr1 = VBA.Filter(varArr1, varArr2(i), False)
Next i
MsgBox Join(varArr1)
End Sub
注意,filter函数在此是模糊查找,下面代码将无法返回我们想要的值
Sub Filter1()
Dim varArr1 As Variant
Dim varArr2 As Variant
Dim i As Integer
varArr2 = Array(10, 1023, 1025)
varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)
For i = 0 To UBound(varArr2)
varArr1 = VBA.Filter(varArr1, varArr2(i), False)
Next i
MsgBox Join(varArr1)
End Sub
七、释放数组
在某些情况下,我们根据需要来释放数组来重新定义数组,或避免数据堆栈。
Erase语句
重新初始化大小固定的数组元素,以及释放动态数组的存储空间。即,Erase可以删除静态数组和动态数组里的数据元素。
Sub Erase1()
Dim arr(1 To 100) As Integer
arr(1) = 1
MsgBox arr(1)
MsgBox UBound(arr)
Erase arr
MsgBox arr(1)
MsgBox UBound(arr)
End Sub
从上面的代码中,我们可以看到,Erase语句用于清除数组元素,对静态数组维数和上标是没有改变的。
而对于动态数组,Erase 语句在释放动态数组所使用的内存后。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
Sub Erase2()
Dim arr() As Integer
ReDim arr(1 To 100)
arr(1) = 1
MsgBox arr(1)
MsgBox UBound(arr)
Erase arr
'ReDim arr(1 To 10)
MsgBox arr(1)
MsgBox UBound(arr)
End Sub
八、数组与单元格区域
通过上面的几个概念,我们明白了数组的定义、赋值。我们最终的目的是通过数组来操作工作表区域中的数据,下面我们通过几个例子来进一步理解数组。
1、将单元格区域赋值给数组
见过程RangeArray1,RangeArray2,RangeArray3
2、拆分合并特定单元格数据
见过程 Split2,Join2,Split3
3、维数转置
见过程RangeArray4
九、数组实例
1、提取不重复数据。见UniqueData过程
2、转置数据区域。见TransposeData过程
上面就是我们入门数组需要学习和理解的内容,谢谢大家!
HOmT398 2007.8.31于北京
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编程数组函数 在程序中,根据实际情况,需要判断某个变量是否为数组,或者数组的下标范围,可以使用系统提供的函数来进行这些操作。下面分别介绍这些函数。 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 和所有关心我们地球家园的朋友们! 此篇版权归https://www.doczj.com/doc/ef12337732.html, 和https://www.doczj.com/doc/ef12337732.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数组基础 数组为可以存储多个数据的变量。 声明数组 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) 给数组赋值
声明数组 什么是数组:连续可索引的具有相同内在数据类型的元素所成的集合,数组中的每一元素具有唯一索引号。更改其中一个元素并不会影响其它元素。 数组的声明方式和其它的变量是一样的,它可以使用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中的控件数组 2009年2月28日 评论发表评论 大家都知道,和VB不一样,VBA中不能直接创建控件数组。然而可以使用WithEvents来模拟相同的功能。我们需要一个类来处理控件的事件,而每一个控件需要一个类实例。对于不同控件的类实例,我们可以使用一个对象数组或者集合来实现。 这里使用按钮控件做为例子来介绍怎样在窗体和工作表中创建控件数组。 创建类 创建控件数组之前,我们需要一个类来处理控件的事件。 在VBE窗口中,单击菜单“插入”->“类模块”,在属性窗口中将类的名称改为“cCB”。 在类模块中添加下面这一行: Private WithEvents m_CB As https://www.doczj.com/doc/ef12337732.html,mandButton 这样你就可以从代码栏的顶部左边下拉列表中选择m_CB并选择右边下拉列表中相应的事件。 完整的代码如下: Private WithEvents m_CB As https://www.doczj.com/doc/ef12337732.html,mandButton ' 初始化,将控件绑定到类 Public Sub Init(ctl As https://www.doczj.com/doc/ef12337732.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 转 看一贴中问[ ]与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数组入门教程集合 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高手运用数组解决各种问题,速度快,代码简洁,很是羡慕,所以逐渐收集了一些资料,与大家分享,也请多多指教。在此,也向高手们致以谢意。 一、数组的分类 按元素数目分:元素数目大小固定的数组和元素数目大小不固定的动态数组。 按维数分:一维数组、多维数组。 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.doczj.com/doc/ef12337732.html,rge(Arr,1) 最小值aa = Application.WorksheetFunction.Min(Arr)
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中处理数组的函数 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的数组理解 一、什么是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数组基础学习 一、数组概念 二、数组就是一个列表或者一组数据表。它是由连续可索引的具有相同内在数据类型的元素所组成的集合,数组中每一个元素都具有唯一的索引号。更改其中一个元素并不会影响到其它元素。 数组存在内存,可以利用索引号获取该集合中每一个子集。 数组的两个特点: 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、二维数组
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(一维数组和二维数组) 一维数组和二维数组的区别,很明显的就是维度不同。定义一个一维数组和一个二维数组,如下图,可以看出,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)数组操作 与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数组入门 一、初识数组 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数组入门教程 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()