|
每个人的方法都不同,我只能根据我个人的学习体会讲一下:1、基础的东西一定要学好,这个不能省,比如:
工作簿的控制:thisworkbook;
工作表的控制:worksheets("sheet1")或者worksheets(n),n是工作表序号;
单元格的控制:range("a1:b10")或者range(cells(1,1),cells(10,2)),推荐后者,配合循环很合适;
当前工作表:就是代码运行前眼睛能看见的工作表,也是代码所在的工作表,可以省略前缀直接引用单元格,所以:
当前工作表可以这么引用:cells(x,y)
非当前工作表只能这么引用:thisworkbook.worksheets("sheets").cells(x,y),如果只有一个工作簿打开,thisworkbook可以省略;
上述内容在vba的help里“excel开发人员参考-概念-工作簿与工作表”以及“单元格和区域”章节都有详细的叙述,建议先看;
2、代码的基础流程控制要掌握好,最常用的就是 for next循环以及 if 条件,尤其是for循环。很多人会走弯路,把注意力放在了单元格填充.resize或者offset这类属性方法上面了,这些工作for循环都能办到,当然效率不见得比resize高。这里的重点是for有助于锻炼你的逻辑思维和流程控制,而resize只是一个矩形填充,毫无技术可言,多数情况下都是有条件的填充,所以for+if比较好用,resize则很有局限性;
3、数组,如果再深入一点可以学习字典。先说数组:
1)数组与for之间也是十分融洽,一维数组与单层for搭配,二维数组与双层for搭配,天衣无缝;
比如函数sum求和,代码也能很容易写出来;
for i to 10 '1到10行
for k=1 to 5 '1到5列
hj=hj+cells(i,k)
next k
next i
数组与上面的很相似:
for i to 10 '1到10行
for k=1 to 5 '1到5列
' if 条件 then
cells(i,k)=arr(i,k) '把数组写入单元格,用resize确实更简单,这里只是强调可以条件填充,resize则不行
' endif
next k
next i
2)字典
字典并非必须,字典可以用数组代替,但字典在大数据的效率很高,数据量越大,效率差异越大。我测试3000条记录两者差距不明显,5000记录以上建议用字典,50000记录基本上会有3-5倍甚至更大的效率差异;
这两者放在一起比较,基本都是用于查询,不过数组除了查询,用途更广泛,字典只是查询,偶尔也能用于统计;
常见的查询场景:
A区域的数据 B区域的数据
查询A区域是否在B区域存在,并把对应结果返回。如果用工作表函数vlookup也能做大部分工作,只是vlookup局限性大,尤其效率很低;
单元格查询(不推荐,也要了解,1000记录以内效率也可以,最多可以放宽到3000-5000记录的查询):
for i=1 to [a10000].end(3).row ‘循环a区域
s=cells(i,1) '读取a列
for k=1 to [h10000].end(3).row ‘循环b区域,假设从h列开始
if cells(k,"h")=s then '比较
cells(i,2)=cells(k,"i") ’把b区域的I列结果返回到A区域的B列
endif
next k
next i
数组查询,仍以上述区域为例,代码结构类似,只是效率更高:
dim arr1
dim arr2
arr1=range(cells(1,1),cells([a100000].end(3).row,2)) ‘把A区域写入数组arr1,是二维数组,单元格区域都是二维的
arr2=range(cells(1,"h"),cells([h100000].end(3).row,"i")) ‘把B区域写入数组arr2
for i=1 to ubound(arr1) ‘循环a区域
for k=1 to ubound(arr2) ‘循环b区域
if arr1(i,1)=arr2(k,1) then '比较
cells(i,2)=cells(k,"i") ’直接写单元格,不需要先用数组来过度。数组与单元格的坐标是对应的;
endif
next k
next i
字典查询,效率最高:
dim zd as object
set zd=createobject("scripting.dictionary")
for i=1 to [h10000].end(3).row ‘先把a区域写入字典
s=cells(i,"h")
zd(s)=cells(i,"i") ’字典左边是查询关键字,也就是h列,右边是内容,也就是i列
next i
for i=1 to [a10000].end(3).row ‘循环a区域
s=cells(i,1)
if zd.exists(s) then ‘字典存在就表示B区域存在,exists方法是速度快的主要原因,不管多少记录,瞬间即可得到;
cells(i,2)=zd(s) ’字典写入b列,字典的内容就是i列的内容,zd(s)是zd.item(s)的简写,是内容不是关键字索引
endif
next i
还有一种效率最高(我个人认为是这样的)的查询,那就是sql查询,这里就不展开了
4、上面我把单元表格、数组以及字典查询详细说了一遍,是因为这类场景非常多见,这是最基础的东西了;
下一步,我建议了解 help-vba语言参考,这是一个字典工具,如果你不知道如何用,可以到这里查help,这里什么都有;
5、还有百度,个人强烈建议使用,比如:
如果不知道如何使用字典,在百度输入”vba字典“,各种用法全都有;
如果要文件检索代码,输入”vba文件检索“,你可以随便抄一段下来自己用;
如果要学习最高效的sql,输入vba SQL,别人的代码随便抄一段下来自己先研究;
只要是vba三个字母开头,基本上所有的vba用法都能找到答案;
|
评分
-
查看全部评分
|