新手学vba数组--示例1 - 『excel在线学习与辅导』 - excel精英培训网 - microsoft excel
前言:不要把vba数组想的太神秘,它其实就是一组数字而已
sub 数组入门1()
dim x as integer
dim arr(1 to 10) '创建一个可以盛下10个数的箱子,第一个位置是arr(1),第二个位置用arr(2)..
for x = 1 to 10 '通过循坏向这个箱子里1-10个位置放入10个数
arr(x) = x '箱子里依次放入数字1-10,即arr(1)=1,arr(2)=2....
next x
'通过上面的循环,数组里装满了10个数字,下面就可以用arr(序数)得到相应位置的数了
msgbox arr(5) '显示数组内第5个数字
end sub
[此贴子已经被作者于2010-8-3 10:30:33编辑过]
这不是与一般的没啥样,只是用arr减少了赋值:
sub 式1()
dim k as integer
dim x as integer
for x = 1 to 10
k = x
next x
end sub
以下是引用兰幻想在2010-8-3 10:20:00的发言:
dim x as integer
dim arr(1 to 10) '创建一个可以盛下10个数的箱子,第一个位置是arr(1),第二个位置用arr(2)..
for x = 1 to 10 '通过循坏向这个箱子里1-10个位置放入10个数
arr()就是那个箱子了,如果不用arr(),range("a1:a10")也可以代替这个箱子呀,这里用arr()有什么优势呢?
打个比方吧:
你要做菜,单元格是菜市场。单元格的数据是菜原料。内存是厨房。
你要炒一盘西红柿炒鸡蛋,需要用鸡蛋时你跑到菜市场(单元格)买回来鸡蛋(数据),而且需要n个鸡蛋就需要跑去买n次。你还要需要西红柿等其他原料。然后每一种原料你都要跑去菜市场买来用
而内相当于厨房,你的原材料(数组)已放在厨房了,你炒菜时需要什么随手拿什么就可以了。
这两种方法哪种炒菜更快呢?
[此贴子已经被作者于2010-8-3 23:44:19编辑过]
private sub commandbutton1_click()
dim r as integer
dim x as long
r = unt
dim arr(1 to 10) as variant '这个为什么不能定义为arr(1 to r)
for x = 1 to r
arr(x) = sheets(x).name
cells(x + 1, 1) = arr(x)
next x
end sub
原来这样就行了
sub 数组1()
dim r as integer
dim x as long
r = unt
dim arr as variant
for x = 1 to r
arr = sheets(x).name
cells(x + 1, 1) = arr
next x
end sub
以下是引用fjmxwrs在2010-8-8 11:09:00的发言:
vba自学好学吗也就是说此例不知道多张表时,超10张,但不知道,怎么办?是不是就应该把这个数组定义大些(箱子多点)可是大到什么程度要怎么来界定或表示?
另外,怎么来显示一下使用的运行时间是多少?
msgbox tine这个时间要怎么写?我想测试下这个运行的时间
sub 测试时间()
dim t
t=timer '记录开始运行时间
for x=1 to 1000000
next
msgbox timer-t '现在的时间减原来的时间t
end sub
sub 式1()
dimarr as integer
dimayy as integer
fo
rarr = 1 to 10
arr =ayy
next ayy
end sub
就这样吗?
个人理解:数组就是存在内存中的一个数据中转站,可以对运行速度有提升。
不懂:26楼和23楼的代码有什么区别?23楼:arr(1 to 10) 26楼 arr23楼给了1-10个位置。26楼还算数组吗?在本地窗口没看到数组的十字
private sub chkprint_click()
if chkprint then
chkprint.caption = "打印"
chkprint.backcolor = rgb(255, 255, 0)
chkprint.forecolor = rgb(0, 0, 0)
else
chkprint.caption = "不打印"
chkprint.backcolor = rgb(192, 192, 192)
chkprint.forecolor = rgb(128, 128, 128)
end if
end sub
private sub cmdsave_click()
'dim eofrow as integer
'eofrow = lls.find("[endofrecord]").row
'lls(eofrow + 1, 1) = lls(eofrow, 1)
'lls(eofrow, 1) = ""
'lls(eofrow - 2, 1) = lls(2, 6)
'lls(eofrow - 2, 2) = lls(3, 3)
'lls(eofrow - 2, 3) = lls(3, 10)
'lls(eofrow - 2, 4) = lls(4, 2)
'ws(2).insert
'irerow.font.background = lls(2, 1).font.background
'irerow.font.bold = lls(2, 1).font.bold
'irerow.font.size = lls(2, 1).font.size
'lls(2, 1) = lls(2, 6)
'lls(2, 2) = lls(3, 3)
'lls(2, 3) = lls(3, 10)
'lls(2, 4) = lls(4, 2)
dim invno as string
dim fndrow as integer
dim insrow as integer
dim tmp as variant
if len(lls(2, 14))) <> 8 then
msgbox "品号一定要是八个号码 (年年月月xxxx)"
exit sub
end if
if lls(3, 3)) = "" then
msgbox "请输入品名"
exit sub
end if
invno = lls(2, 14)
fndrow = 0
on error resume next
fndrow = lumns(2).find(invno).row
on error goto 0
if fndrow > 0 then
'tmp = msgbox("are you sure to overwrite the " & invno & " data ?", vbyesno, "update the existing data")
tmp = msgbox("你确定要覆盖 " & invno & " 的资料吗 ?", vbyesno, "update the existing data")
if tmp = vbno then
exit sub
end if
insrow = fndrow
else
insrow = 2
end if
cmdcancel.visible = false
'lls(2, 8).formula = "=now()"
if chkprint then
sheet1.printout
end if
newrecord
exit sub
'msgbox "data saved"
end sub
sub newrecord()
'tmp = lls(1, 2)) + 1
'tmp = right("000000" & tmp, 6)
if lls(1, 2), 4) <> format(date, "yymm") then
tmp = format(date, "yymm") + "0001"
else
tmp = lls(1, 2), 4) & right("000" & cstr(cint(lls(1, 2), 4)) + 1), 4)
end if
end sub
private sub cmdcancel_click()
cmdcancel.visible = false
newrecord
end sub
private sub worksheet_selectionchange(byval target as range)
end sub
谁能帮我解释一下这个
楼主: 兰幻想
小学1年级
小学2年级
大学2年级
幼儿园中班
硕士研究生
版主
组:vba快速入门3班
组:vba特训营
组:e友之家段位3 金币8892 积分8786帖子6236最佳答案211
小学1年级
小学2年级
幼儿园小班
幼儿园小班
站长推荐 关闭
论坛excel全免费学习班报名开始了
论坛excel免费在线培训班开始招生了,新手班,函快班,函数入门班、vba入门班、函数中级班、图表班、vba中级班等即将免费招生,快来看看招生计划吧。另外还有报名有关的常见问题答疑。
查看
原文网址: lpx/forum-viewthread-tid-137701-fromuid-427362.html
vba数组学习示例教程之2:了解数组的维数 - 『excel在线学习与辅导』 - excel精英培训网 - microsoft excel
示例1我们了解了可以在内存中创建一个可以放10个数的数组空间arr(1 to 10) ,这个数组只有1列数据,它就是传说中的一维数组,那么数组可不可以有多列呢? 答案是可以。由多行多列组成的就是二维数组。如arr(1 to 10, 1 to 3)就是一个10行3列的数组空间,可以放30个数据。
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个元素。
下期示例展望:也许你会问,单元格区域和数组可以互换吗,单元格区域的数据装入数组中 或 数组中的数据放入单元格区域中一定要用循环吗?请看明天的vba数组入门第3例。附:新手学vba数组--示例1 lpx/forum.php?mod=viewthread&tid=136776
[此贴子已经被作者于2010-8-4 9:11:12编辑过]
楼主: 兰幻想
幼儿园小班
幼儿园小班
初中2年级
我来学习了!校长辛苦啦!
硕士研究生
版主
组:vba快速入门3班
组:vba特训营
组:e友之家段位3 金币8892 积分8786帖子6236最佳答案211
小学1年级
哇塞 老大真高
大学2年级
站长推荐 关闭
论坛excel全免费学习班报名开始了
论坛excel免费在线培训班开始招生了,新手班,函快班,函数入门班、vba入门班、函数中级班、图表班、vba中级班等即将免费招生,快来看看招生计划吧。另外还有报名有关的常见问题答疑。
查看
原文网址: lpx/forum-viewthread-tid-137701-fromuid-427362.html
vba数组入门教程第3例:把单元格数据搬入内存 - 『excel在线学习与辅导』 - excel精英培训网 - microsoft excel
vba数组储存于内存中,单元格的数据,储存于
工作表的单元格区域里。
从单元格中取出数据放在内存。
单元格是行列结构的数据表,把它搬到内存中也应该是二维的数组。怎么搬呢?
为了更好的搬运,内存先批了一块土地。内存说了,你有多少个单元格我不问,反正你有多少数据我提供多大的地方。
一、声明:
dim arr as variant '声明一个变量,这个变量应该是一个可以转化成数组的variant类型(可以省略),不能声明其他数据类型
如: dim arr as string 这种声明就是错误的,存放单元格的数据类型必须是 variant(也可以省略)
dim arr(1 to 10, 1 to2) , 这种声明也是错误的,固定大小的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
下期预告:搬入内存的目的是为了更快速的计算,计算结束后,怎么搬回到单元格中呢?且听下回分解。
[此贴子已经被作者于2010-8-5 12:07:31编辑过]
quote:
以下是引用fjmxwrs在2010-8-5 13:36:00的发言:
for x = 1 to 10
arr(x) = int(rnd() * 200) + 1 & iif(rnd() > 0.5, "kg", "公斤") '随即1-200的整数加上单位放在arr数组中
next x
msgbox arr(1)
用msgbox显示值有,为什么f8本地窗口中却是空值,这是为什么?
宏运行结束,过程序变量和数组都会被内存释放,你当然看不到了,如果想看,可以在程序最后加入stop语句
for x = 1 to 10
arr(x) = int(rnd() * 200) + 1 & iif(rnd() > 0.5, "kg", "公斤") '随即1-200的整数加上单位放在arr数组中
next x
msgbox arr(1)
stop
dim arr(1 to 10, 1 to 3)
这样定义二维数组是错误的吗,没有错误吧。
哦,是不是dim arr(1 to 10, 1 to 2 ) 这种声明固定了大小就不能一次性装入单元格数据,但能通过循环一个一个的装入。
回复:(兰幻想)vba数组入门教程第3例:把单元格数...
谢谢!
<embed align=middle src=xl.qzrx/flash/vista-clock.swf width=195 height=145 type=application/x-shockwave-flash quality="high" allowscript
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论