跳到主要内容

录制你的第一个宏

认识宏

一组 VBA 指令的集合就组成了宏。而在 VBA 中更专业的名称是过程。一段完整的 VBA 程序就是一个过程。

录制宏

  1. 新建一个空白工作簿。
  2. 单击【开发工具】选项卡,在【代码】组中选择【录制宏】命令,打开【录制宏】对话框。如果你的【开发工具】选项卡不可见,请参阅:启用开发工具选项卡
  3. 在本例中,宏名:“HelloWorld”,快捷键填写小写 j,保存在当前工作簿,说明:“这是我的第一个宏”。
    录制宏对话框设置
    录制宏对话框设置
  4. 单击【确定】关闭对话框并开始录制宏动作。
  5. 选择单元格 B1,在编辑栏里输入”Hello World!",并按 Enter 键结束输入,此时 Excel 会自动激活单元格 B2
  6. 选择【开发工具】选项卡,在【代码】组中选择【停止录制】命令(或单击状态栏最左边的【停止录制】按钮)。
  7. 恭喜,你编写了世界上最著名的程序 "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】,模块中的代码就会在右侧的代码窗口中显示出来。

录制的宏代码类似如下代码:

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 中的所有操作,所生成的代码往往有很多冗余。通过去除这些冗余代码,宏代码才能够更高效地运行。

通常录制宏生成的代码执行效率不高,原因有二:一是代码使用了很多 ActivateSelect 等方法,影响了代码的执行效率,需要在实际应用中做相应的优化;第二,录制宏无法生成控制程序流程的代码,如循环结构、判断结构等。

前面录制的宏代码可以优化为:

Sub HelloWorld()
'
' HelloWorld 宏
' 这是我的第一个宏
'
' 快捷键: Ctrl+j

    With ActiveCell
        .FormulaR1C1 = "Hello World!"
        With .Font
            .Bold = True
            .Italic = True
            .Underline = xlUnderlineStyleSingle
        End With
    End With
End Sub

后续课程还会专门讲解代码优化。

评论

您的电子邮件地址不会显示出来。*号为必填项。