VBA在实际工作中的运用
发表于2015-07-08
VBA在实际工作中的运用 | ||||||||
一、概要 | ||||||||
阅读定位: | ||||||||
学习VBA的伙伴。 | ||||||||
尝试制作模拟器的伙伴。 | ||||||||
目前在转换数据库数据的伙伴。 | ||||||||
简要阐述: | ||||||||
VBA数组:类似于单元格的行和列,是一组有维度的数据,由一个符号代表,并且可以在别的地方使用,比如调出数据,更改数据。 | ||||||||
二、维度演示 | ||||||||
分为一维数组演示与二维数组演示。 | ||||||||
a)一维数组 | ||||||||
准备工作: | ||||||||
打开 1 个工作表。 | ||||||||
ALT+F11 打开代码窗,单击sheet1,进入编辑。 | ||||||||
Sub 一维数组() | ||||||||
Dim arr | ||||||||
arr = Array(1, 2, 3,4) | ||||||||
MsgBox arr(1)'一维数组,注释语句用单引号 | ||||||||
End Sub | ||||||||
VBA里面不存在大写,注意更正。 | ||||||||
输入代码后按F8调试,黄色条代表进度。 | ||||||||
F9是断点,即按F9后再按F5,即可运行至此。(寻BUG) | ||||||||
a)二维数组 | ||||||||
准备工作: | ||||||||
打开 1 个工作表。 | ||||||||
在sheet1,A1位置输入“我在学习” | ||||||||
ALT+F11 打开代码窗,单击sheet1,进入编辑。 | ||||||||
代码展示: | ||||||||
Sub 二维数组() | ||||||||
Dim x As byte, y As byte | ||||||||
Dim arr(1 To 3, 1 To 2) '3行2列,第一个代表行:行列,行在前。 | ||||||||
For x = 1 To 3 | ||||||||
For y = 1 To 2 | ||||||||
arr(x, y) = Cells(x, y) 'a1:b3的数据装进数组中 | ||||||||
Next y | ||||||||
Next x | ||||||||
MsgBox arr(1,1) '根据提供的行数和列数显示数组 | ||||||||
arr(2, 1) = "do my best" | ||||||||
MsgBox arr(1, 2) | ||||||||
End Sub | ||||||||
VBA里面不存在大写,注意更正。 | ||||||||
输入代码后按F8调试,黄色条代表进度。 | ||||||||
综上:上面是介绍数组的概念,即了解数组是什么情况。 | ||||||||
三、装入数据 | ||||||||
分为动态数组装入与循环装入。 | ||||||||
a)动态数组 | ||||||||
sub 动态数组() | ||||||||
dim arr | ||||||||
arr= range("a1:b3")'直接装入,3行2列 | ||||||||
redim preserve arr(1 to 3,1 to 2) | ||||||||
msgbox arr(1,1)'显示单元格A1的数据 | ||||||||
erase arr | ||||||||
endsub | ||||||||
动态数组装入的结构为 | ||||||||
声明 dim arr | ||||||||
暴力装入 arr= 单元格区域 | ||||||||
重新定义数组行列(对应) | ||||||||
使用后释放数组内存 | ||||||||
b)循环装入 | ||||||||
sub 循环装入() | ||||||||
dim arr(1 to 2,1 to 3) | ||||||||
dim i as byte,j as byte | ||||||||
for I =1 to 2 | ||||||||
for j =1 to 3 | ||||||||
arr(I,j)=cells(I,j)’把a1:c3区域装入数组 | ||||||||
next | ||||||||
next | ||||||||
msgbox arr(1,1)'显示A1数据 | ||||||||
erase arr | ||||||||
end sub | ||||||||
循环装入的结构为 | ||||||||
声明 dim arr(1 to M,1 to N) | ||||||||
循环装入 arr= 单元格区域 | ||||||||
使用后释放数组内存 | ||||||||
两者各有各的好,装数据自然是动态方便一点。 | ||||||||
四、搬出数据 | ||||||||
方式分为两种:a)循环赋值;b)对应行和列相同,直接赋值 | ||||||||
a)循环赋值 | ||||||||
这一段我心虚,略过 | ||||||||
参考如下 | ||||||||
for I = 1 to m | ||||||||
for j 1 to n | ||||||||
cells(I,j)=arr(I,j) | ||||||||
next | ||||||||
next | ||||||||
运用时的问题:繁琐。 | ||||||||
为什么运用:其他方法赋值没用好,出现了BUG。 | ||||||||
b)直接赋值 | ||||||||
sub 动态数组() | ||||||||
dim arr | ||||||||
arr= range("a1:b3")'直接装入,3行2列 | ||||||||
redim preserve arr(1 to 3,1 to 2) | ||||||||
msgbox arr(1,1)'显示单元格A1的数据 | ||||||||
erase arr | ||||||||
endsub | ||||||||
引用这个更改一下: | ||||||||
sub 动态数组() | ||||||||
dim arr | ||||||||
arr= range("a1:b3")'直接装入,3行2列 | ||||||||
redim preserve arr(1 to 3,1 to 2) | ||||||||
range("c1:d3")=arr '原封不动直接装出。 | ||||||||
erase arr | ||||||||
endsub | ||||||||
刚开始使用容易把行列搞混,或者对应不上。 | ||||||||
解决办法:F8调试。 | ||||||||
五、题外延生【转换数据库数据】 | ||||||||
上面的介绍可以满足一般模拟器的制作需求。 | ||||||||
但在实际工作中,可能下面的延生更加能帮助我们。 | ||||||||
问题举例: | ||||||||
如 | 1 | 2 | 3 | |||||
组合成 | {1,2,3} | |||||||
相信类似的工作,每个同行都会遇到。 | ||||||||
一般处理为 & 衔接(excel表里) | ||||||||
1 | 2 | 3 | ||||||
="{"&C129&","&D129&","&E129&"}" | ||||||||
实际项目中,这个方法较为繁琐。 | ||||||||
但我们可以用Function来解决。 | ||||||||
代码: | ||||||||
Function wayne_linknum(rng As Range) | ||||||||
y$ = rng(1, 1) | ||||||||
i% = 2 | ||||||||
Do Until rng(1, i) = "" | ||||||||
y = y & "," & rng(1, i) | ||||||||
i = i + 1 | ||||||||
Loop | ||||||||
wayne_linknum = "{" & y & "}" | ||||||||
End Function | ||||||||
情况对比: | ||||||||
1 | 2 | 3 | ||||||
{1,2,3} | ||||||||
=wayne_linknum(C142) | ||||||||
注释:上面的情况可以用数组的join方式解决。 | ||||||||
灯下黑 | ||||||||
2015/7/8 |