认识宏
一组 VBA 指令的集合就组成了宏。而在 VBA 中更专业的名称是过程。一段完整的 VBA 程序就是一个过程。
录制宏
- 新建一个空白工作簿。
- 单击【开发工具】选项卡,在【代码】组中选择【录制宏】命令,打开【录制宏】对话框。如果你的【开发工具】选项卡不可见,请参阅:启用开发工具选项卡。
- 在本例中,宏名:“
HelloWorld
”,快捷键填写小写j
,保存在当前工作簿,说明:“这是我的第一个宏
”。
- 单击【确定】关闭对话框并开始录制宏动作。
- 选择单元格
B1
,在编辑栏里输入”Hello World!
",并按 Enter 键结束输入,此时 Excel 会自动激活单元格B2
。 - 选择【开发工具】选项卡,在【代码】组中选择【停止录制】命令(或单击状态栏最左边的【停止录制】按钮)。
- 恭喜,你编写了世界上最著名的程序 "Hello World"。
录制宏对话框设置详解
宏名
我们给宏取的名称。Excel 会给宏指定一个默认名称,如:宏1,但你应该给宏取个简短的有意义的名称,最好能描述这个宏实际是用来干什么的。例如,可将用来获取文件名称的宏命名为 GetFileName
。宏名并不局限于使用英文,但是通常都使用英文宏名。
快捷键
可选项,执行这个宏的快捷键。为了不和操作系统或 Excel 内置的快捷键相冲突,可以输入小写的 j
,即设置快捷键为 Ctrl+j,因为这个快捷键基本没有使用。
保存在
默认是当前工作簿。将宏保存在当前工作簿中意味着宏和 Excel 文件是一起保存的。再次打开该工作簿时,即可以运行该宏。同样,如果你将该工作簿发送给另一个用户,该用户也可以运行该宏。
个人宏工作簿 (名称为:PERSONAL.XLSB
) 是隐藏的工作簿,如果您选择将记录保存在个人宏工作簿中,则会创建它,默认存放在 C:\Users\<YourUserName>\AppData\Roaming\Microsoft\Excel\XLSTART
下。Excel 启动时会自动打开此工作簿,以便您使用宏。此工作簿默认是隐藏的,如果要显示它,请选择【视图】选项卡,在【窗口】选项组中选择【取消隐藏】。建议将通用的宏存储在个人宏工作簿中。
说明
可选项,如果工作表中的宏太多,或者你需要向用户提供有关宏功能的更详细说明,可以使用它。
查看宏
要查看宏代码,需要激活 Visual Basic 编辑器,俗称 VBE,有几种方法:
- 按 Alt+F11。
- 选择【开发工具】选项卡,在【代码】功能组,单击【Visual Basic】。
- 在工作表标签上单击右键,选择【查看代码】。
在 VBE 中,工程项目窗口显示了所有打开的工作簿和加载项。该列表以树状图形式显示在屏幕左侧,可以展开或折叠。刚才所录制的代码就保存在当前工作簿的【模块1】中。双击【模块1】,模块中的代码就会在右侧的代码窗口中显示出来。
如果在 VBE 中看不到【工程资源管理器】,可以使用快捷健 Ctrl+R,或者在菜单中选择【视图】【工程资源管理器】。
录制的宏代码类似如下代码:
Sub HelloWorld()
'
' HelloWorld 宏
' 这是我的第一个宏
'
' 快捷键: Ctrl+j
'
Range("B1").Select
ActiveCell.FormulaR1C1 = "Hello World!"
Range("B2").Select
End Sub
第 1 行:录制的宏是一个名为 HelloWorld
的子过程。
第 2 行到第 7 行是注释。请注意,Excel 在过程的顶部插入了一些注释。这些注释是出现在【录制宏】对话框中的一些信息。这些注释行以撇号('
)开头并不是真正需要的,删除它们对宏的运行没有任何影响。
第 8 行:此语句选择单元格 B1,使单元格 B1 成为活动单元格。
第 9 行:此语句将您在录制时键入的文本插入到活动单元格中。
第 10 行:选择单元格 B2。出现这句是因为在 B1 单元格输入完文本,按回车确认后,Excel 默认会选择单元格 B2。
第 11 行:这表示宏的结束。
测试宏
要测试本宏,我们需要返回 Excel,可以使用以下方法:
- 按 Alt+F11。
- 在 VBE 中选择【文件】选项卡,单击【关闭并返回到 Microsoft Excel】。快捷键: Alt+Q。
- 用鼠标激活 Excel 工作簿窗口。
当 Excel 处于活动状态时,激活一个工作表,选择任意一个单元格,使用以下任一方法执行此宏:
- 按下 Ctrl+J 组合键。
- 或者选择【开发工具】选项卡,在【代码】功能组,单击【宏】,打开【宏】对话框(或者按快捷键:Alt+F8),在对话框中选择刚才录制的 【HelloWorld】 宏,并单击【执行】。
该宏会立即将 Hello World!
输入到单元格 B1 中,并激活单元格 B2。无论你选择什么单元格,执行该宏后都会在单元格 B1 中输入 Hello World!
并选择单元格 B2。此时你可能会想,这宏能不能在我选择的单元格里输入 Hello World!
,不要每次都在单元格 B1 里输入呢?
编辑宏
我们再次按下 Alt+F11,回到 VBE 中,将第8行代码:Range("B1").Select
选中并按删除键删除掉或者语句前面输入 '
注释掉,再次回到 Excel 中,选择任意一个单元格,并按 Ctrl+J 再次执行录制的宏,这时你发现这次宏在你选择的单元格输入 Hello World!
了!
如果你又想给输入的内容加粗、斜体、加下划线怎么办?还有,我也不想每次都要选择单元格 B2。别着急,我们可以再次录制一个给字体加粗、斜体、加下划线的宏,将加粗、斜体、加下划线的语句:
ActiveCell.Font.Bold = True
ActiveCell.Font.Italic = True
ActiveCell.Font.Underline = xlUnderlineStyleSingle
复制到 HelloWorld
宏中,并将选择单元格 B2 的语句删除或注释掉,修改后的代码如下:
Sub HelloWorld()
'
' HelloWorld 宏
' 这是我的第一个宏
'
' 快捷键: Ctrl+j
ActiveCell.FormulaR1C1 = "Hello World!"
ActiveCell.Font.Bold = True
ActiveCell.Font.Italic = True
ActiveCell.Font.Underline = xlUnderlineStyleSingle
End Sub
这不就是你要的宏么?
录制宏的局限性
原来 Excel VBA 编程就是一个缝合怪啊?不知道的代码可以通过录制宏来获得,再把相关的代码组和不就完事了?确实,VBA 没有你想的哪么难,但是通过录制宏来获取的代码也有一定的局限性:
录制宏生成的代码可能与用户的操作不一致。例如,用户在设置受保护工作表时输入的密码不能记录在代码中;无法通过设置工作表控件的属性来生成代码。
一般来说,录制宏生成的代码可以实现相关功能,但往往不是最优、最高效的代码,因为录制器会“忠实地”记录 Excel 中的所有操作,所生成的代码往往有很多冗余。通过去除这些冗余代码,宏代码才能够更高效地运行。
通常录制宏生成的代码执行效率不高,原因有二:一是代码使用了很多 Activate
、Select
等方法,影响了代码的执行效率,需要在实际应用中做相应的优化;第二,录制宏无法生成控制程序流程的代码,如循环结构、判断结构等。
前面录制的宏代码可以优化为:
Sub HelloWorld()
'
' HelloWorld 宏
' 这是我的第一个宏
'
' 快捷键: Ctrl+j
With ActiveCell
.FormulaR1C1 = "Hello World!"
With .Font
.Bold = True
.Italic = True
.Underline = xlUnderlineStyleSingle
End With
End With
End Sub
后续课程还会专门讲解代码优化。