VBA编程基础

VBA(Visual Basic for Application)是内置于Office组件的一种开发环境,可以使用VB编程语言对Word、Excel等进行深入的应用开发;比如,在Excel中可以定义宏(macro),创建自定义函数,创建窗体界面,操作Excel对象,使用ActiveX对象扩展更多功能等。

使用VBA之前还需要注意,正是由于VBA的功能非常强大,所以也会有人编写一破坏性的程序,如宏病毒;所以,在使用包含VBA代码的Excel数据时要注意防范,应明确文件的来源是否可靠,并安装安全软件进行防范。当然,如果只是自己或团队内部使用VBA解决工作中的难题还是很方便的,下面就来了解VBA的应用。

当Excel工作簿中包含了VBA代码时,应将文件保存为.xlmx扩展名的文件。打开VBA代码工具时需要用到Excel功能区的“开发工具”选项卡,如果功能区中没有显示此选项卡,可以在功能区的空白处点击鼠标右键,然后在菜单中选择“自定义功能区”,打开Excel选项窗口后,在主选项卡中选中“开发工具”,并点击右下角的“确定”按钮确认,如下图所示。

显示开发工具选项卡

接下来,点击“开发工具”选项卡>>“代码”组>>“Visual Basic”打开VBA开发窗口,如下图所示。

VBA开发窗口

如上图所示,可以看到一些常用的窗口元素,如标题栏、菜单栏、工具栏;此外,在“工程”窗口中包含了VBA项目中的文件和对象,比如,Sheet1就是工作簿中的Sheet1工作表对象,ThisWorkbook就是工作簿对象。在“属性”窗口中显示了当前选中对象的属性,工作中可以根据需要修改属性值。

下面通过“工程”窗口中“VBAProject”的右键菜单“插入”>>“模块”创建一个新的模块文件,默认名为“模块1”,如下图所示。

创建新模块

如图中所示,在“工程”窗口中显示了新的“模块1”(位置①),在主工作区域的位置②则是编写代码的地方,模块中可以定义子程序和函数;在VBA中还可以创建的文件类型有类(Class)和用户窗体文件,后面的文章会详细介绍,下面首先讨论如何在模块文件创建并执行子程序(Sub)与函数(Function)。

子程序与函数的功能比较接近,都是对功能代码的封装,并且可以使用一个或多个参数,或者没有参数;不同的是,子程序没有返回值,而函数有返回值。定义子程序时,使用Sub语句开始,使用End Sub语句结束,如下面的代码(第一行的VBA标注代码类型,不属于正式代码的组成部分)。

VBA
Sub test()
    Sheet1.Cells(1, 1) = "Hello"
End Sub

代码中定义了一个名为test的子程序,子程序名称后的一对圆括号中可以定义参数,本例没有参数。子程序内部,通过Sheet1对象调用了第一行第一列的单元格,并指定单元格内容为“Hello”。接下来点击工具栏中的执行按钮(绿色三角)或键盘F5键就可以执行test()子程序,执行后可以切换到Excel界面(Alt+F11),可以看到A1单元格中显示了Hello。

接下来修改模块1中的代码如下。

VBA
Function sayHello(name As String)
    sayHello = "Hello, " & name
End Function

Sub test()
    Sheet1.Cells(1, 1) = sayHello("Tom")
End Sub

点击键盘F5键执行程序,如果出现宏的执行窗口,保持默认的test,即执行的子程序名称;然后,点击“运行”按钮,如下图所示;执行后在Sheet1工作表的A1单元格会显示“Hello, Tom”。

执行宏

本例,首先定义了sayHello()函数,其参数为字符串(String)类型的name,函数结构中通过函数名返回执行结果,本例返回了“Hello, ”和name参数的文本内容。test()子程序中,将Sheet1工作表的A1单元格内容设置为sayHello()函数的返回值,而调用sayHello()函数时将参数设置为“Tom”,所以单元格最终显示的内容就是“Hello, Tom”。此外,可以看到定义的子程序实际就是Excel中的宏,它可以执行代码而不需要返回数据。

模块中定义的函数也可以在单元格中直接使用,在Sheet1工作表的A1单元格中输入公式“=sayHello("Tom")”,单元格同样会显示“Hello, Tom”,如下图所示。

在单元格调用自定义函数

Excel中有大量的函数可以使用,在VBA代码中则可以通过Application对象调用Excel内置函数。如修改模块1的代码如下。

VBA
Sub test()
    Sheet1.Cells(1, 1) = Application.Min(1, 2, 3)
End Sub

本例通过Application对象调用了Excel中的Min()函数,执行代码后,Sheet1工作表的A1单元格会显示1。

接下来的学习过程中,对于简单的输出结果可以使用两种方式快捷显示。第一种方式是使用消息对话框的形式,需要调用MsgBox()函数,将显示的内容放在其第一个参数即可,如修改模块1代码如下。

VBA
Sub test()
    MsgBox ("Hello, Tom")
End Sub

执行代码后会显示如下图所示的消息对话框。

消息对话框

另一种方式是在“立即窗口”中显示信息,首先通过菜单“视图”>>“立即窗口”打开立即窗口,然后可以调用Debug对象的Print()方法显示信息,如修改模块1的代码如下。

VBA
Sub test()
    Debug.Print ("Hello, Tom")
End Sub

执行代码后会在立即窗口中显示“Hello, Tom”,如下图所示。

在立即窗口显示信息

本文介绍了在Excel中进行VBA编程的基本方法,下面做一些小结:

  • 包含VBA代码的Excel文件应保存为.xlsm格式。
  • 在Excel中通过“开发工具”选项卡>>“代码”组>>“Visual Basic”打开VBA开发环境。
  • VBA代码以行为单位。
  • 可以在模块中定义子程序和函数。子程序使用Sub...End Sub语句结构定义。函数使用Function...End Function语句结构定义。
  • VBA中定义的子程序即为Excel中的宏。
  • VBA中定义的函数可以在代码的其它地方调用,也可以在工作表的单元格中调用。
  • VBA代码中可以使用Application对象调用Excel内置函数。
  • 可以使用MsgBox()函数显示消息对话框。
  • 可以在使用Debug.Print()方法在立即窗口中显示调试信息。