【VBA研究】怎样将单元格数据赋给数组
作者:iamlaosong
将⼯作表中的数据赋给数组或者将数组的数据赋给⼯作表,⼀般有两种。⼀种是循环的⽅法,⼀个⼀个的传,这样的⽅法⼀般⽤于须要对每⼀个数据特别处理的场合,还有⼀种是⼀次性⽤赋值语句传,就速度来说,另外⼀种⽅法要快得多。看以下例程:
Sub tt()
Dim arr1(240000, 4)
Dim arr2()
lineno = [A1048576].End(xlUp).Row      '⾏数
'循环给数组赋值。数组myarr必须先定义⼤⼩
t1 = Now()
For i = 3 To lineno
k = i - 2
arr1(k, 1) = Cells(i, 1)
arr1(k, 2) = Cells(i, 2)
arr1(k, 3) = Cells(i, 3)
arr1(k, 4) = Cells(i, 4)
Next i
t2 = Now()
Cells(2, 5) = TimeValue(t2) - TimeValue(t1)
'⼀次性给数组赋值。数组arr不能定义⼤⼩和类型
t1 = Now()
arr2 = Range("a3:d" & lineno)
t2 = Now()
Cells(2, 6) = TimeValue(t2) - TimeValue(t1)
MsgBox arr1(20000, 2) & "=" & arr2(20000, 2)
End Sub
只是要注意的是,循环赋值的⽅法数组必须先定义维数和⼤⼩,然后才⼲使⽤,⽽⼀次性赋值的正好相反。不能定义维数和
数据⼀次性读⼊数组arr2后。arr2成为⼀个⼆维数组。即使是读取⼀列数据。也是⼆⼤⼩,否则会报错。此外注意,数据⼀次性读⼊数组
维数组,数组下标都是从1開始,即arr2(1,1),arr2(2,1),arr2(3,1),arr2(4,1),。。
另⼀点要注意,当读取的⼯作表⾮当前⼯作表时。range对象后⾯须要加上valuekeyword,否则会报错,⽐如:
'⽅法⼀:直接读取
DaiLiNo = Sheets("代理点").[B65536].End(xlUp).Row          '⾏数
DaiLiName = Sheets("代理点").Range("B2:B" & DaiLiNo).Value
'⽅法⼆:激活⼯作表后读取
怎么给数组赋值Worksheets("代理点").Select
DaiLiNo = [B65536].End(xlUp).Row          '⾏数
DaiLiName = Range("B2:B" & DaiLiNo)
DaiLiNo = DaiLiNo - 1                      '数据从第2⾏開始,所以总数量要减⼀
假设赋值范围⽤⾏列号表⽰,则⽤下列语句(pos_fst, pos_ems是两个參数,各⾃是数据起始⾏和数据所在列):
maxrow = Cells(65536, pos_ems).End(xlUp).Row
Mail = Range(Cells(pos_fst, pos_ems), Cells(maxrow, pos_ems))
⽤上⾯的例程測试发现,即使20多万条数据,第⼀种⽅法⽤时⾮常少(4.62963E-05)。⽽另外⼀种⽅法却差点⼉不⽤时间(0)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。