【VBA研究】如何将单元格数据赋给数组

【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
滚动体
不过要注意的是,循环赋值的⽅法数组必须先定义维数和⼤⼩,然后才能使⽤,⽽⼀次性赋值的正好相反,不能定义维数和
数据⼀次性读⼊数组ar r2后,ar r2成为⼀个⼆维数组,即使是读取⼀列数据,也⼤⼩,否则会报错。此外注意,数据⼀次性读⼊数组ar
是⼆维数组,数组下标都是从1开始,即arr2(1,1),arr2(2,1),arr2(3,1),arr2(4,1),。。。
还有⼀点要注意,当读取的⼯作表⾮当前⼯作表时,range对象后⾯需要加上value关键字,否则会报错,例如:
'⽅法⼀:直接读取
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)。
注意:Range(Cells(pos_fst, pos_ems), Cells(maxrow, pos_ems))这种表⽰⽅法只适合当前⼯作表,如果⾮当前⼯作表,在前⾯加上sheets的限定后,就会报错,但sheets(1).range("a1:a10")这种表⽰⽅法没有问题。
下⾯给⼀个根据安徽区县和所有省区县两张表形成⼀个安徽出⼝到各省区县的点到点矩阵表例程:
Sub set_matrix()
'
Dim sarr1(), sarr2()
Dim mrow1, mrow2, i, j, k As Integer
'从第3⾏开始读
mrow1 = Sheets("安徽").[A65536].End(xlUp).Row
sarr1 = Sheets("安徽").Range("B3:D" & mrow1).Value
mrow2 = Sheets("全国").[A65536].End(xlUp).Row
sarr2 = Sheets("全国").Range("B3:D" & mrow2).Value
'从第4⾏开始填
kk = 4
For i = 1 To mrow1 - 2
For j = 1 To mrow2 - 2
Cells(kk, 1) = kk - 3
Cells(kk, 2) = sarr1(i, 1)
Cells(kk, 3) = sarr1(i, 2)
Cells(kk, 4) = sarr1(i, 3)
Cells(kk, 5) = sarr2(j, 1)
Cells(kk, 6) = sarr2(j, 2)
Cells(kk, 7) = sarr2(j, 3)压缩胶囊
三合一连接件kk = kk + 1
Next j
Application.StatusBar = "完成:" & Round(i * 100 / mrow2, 2) & "%"
Next i
自动喷香机Application.StatusBar = "完成:100%"
MsgBox "填写完毕!"
End Sub

本文发布于:2024-09-22 07:02:41,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/166096.html

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

标签:数组   数据   赋值   作表
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议