VBA在Excel处理中的应用
VBA是一种专门用于处理Office文档的编程语言,尤其擅长做重复性的工作,本文专门介绍怎么把VBA用到Excel处理中。Word和PowerPoint也支持VBA,但是一方面它们的文档结构比较复杂(Excel就是单纯的表格),另一方面它们的编辑过程通常是渐进的(Excel有可能是程序生成的),创造性的东西多,套路化的东西少,所以相比于它们,Excel更适合于使用VBA。
关于VBA的入门介绍,Getting Started with VBA in Office 这篇文章已经写得很好了,有几点值得提一下:1. VBA脱胎于VB,所以编程体验上和VB很像;2. 执行VBA的时候,运行时环境已经由Office准备好了,VBA编程就是通过与一些Office相关对象的交互来达成目标。
下面通过一个小例子来展示一下怎么用VBA来处理Excel:
有这样一个Excel工作簿,它由三个工作表(Sheet1、Sheet2、Sheet3)组成,它的Sheet2和Sheet3都是空白。Sheet1中的数据有三列,x这一列是数字1-99,除去5,y这一列是2-198的等差数列,公差为2,除去4和8,坐标这一列只有表头。要求将x和y组合成坐标的形式放到坐标这一列中,如果有为空的,视为0。
原始数据:
x | y | 坐标 |
---|---|---|
1 | 2 | |
2 | ||
3 | 6 | |
4 | ||
10 | ||
6 | 12 | |
…… | …… | |
99 | 198 |
生成数据所用的代码:
Sub prepareData()
Cells(1, 1).Value = "x"
Cells(1, 2).Value = "y"
Cells(1, 3).Value = "坐标"
For i = 2 To 100
num = i - 1
If num <> 5 Then
Cells(i, 1).Value = num
End If
If num <> 4 / 2 And num <> 8 / 2 Then
Cells(i, 2).Value = num * 2
End If
Next
End Sub
值得注意的有三点:1. Cells就是我们和Excel文档之间交互的接口,可以将它看成是一个包含有所有单元格的二维数组;2. 单元格有许多属性,需要用.value读取或设置它的内容;3. Sub表示这是一个子程序,其实也就是一个宏,Office里宏的本质也就是一个子程序。
提示:要进入VBA环境,首先需要设置一下Excel,让“开发工具”选项卡显示出来,之后点击这个选项卡下的“Visual Basic”图标,此时就会弹出一个代码编辑窗口,写好了子程序,光标放在子程序内,按一下F5就会执行了。
根据已有数据生成坐标所用的代码:
Sub generateCoordinates()
For i = 2 To 100
x = Cells(i, 1).Value
y = Cells(i, 2).Value
If x = "" Then
x = "0"
End If
If y = "" Then
y = "0"
End If
Cells(i, 3).Value = "'(" & x & "," & y & ")"
Next i
End Sub
值得注意的是倒数第三行,最后拼装坐标时,左括号左边有一个单引号,因为我发现没有单引号时,Excel会把(50,100)坐标和以后的坐标都解析为数字,推测和Excel内部的数据表示方式有关。
本文介绍VBA,但并不推崇VBA,原因有两点:
-
无论是编程环境还是语言模型,VBA比其他语言都差太多了,开发效率很低。(同其他语言相比,使用VBA唯一的好处是——背靠大树好乘凉,因为有Office的宿主环境,所以在数据的使用上会方便些。比如数据本身是存在Excel表中的,那么使用VBA,直接用Cells方式拿数据,多方便。如果不这样,需要用别的程序读取Excel文件,经过层层转化才能看到数据,要生成Excel,又得额外费功夫,看看对不对还得用Excel打开看看,多累。)
-
相比于学VBA,充分掌握图形界面的功能收益更大。(图形界面符合人的认知,学习成本低,像VBA,可能花很长时间才能找到解决一个问题的方案,而VBA的使用通常是一次性的,这样的代价就太大了。)