第1部分 基础入门篇

第1章 Excel VBA起步

在日常 Excel 使用中,如果需要重复执行同样顺序的命令,那么就可以使用Excel VBA来使这些过程自动化以节省时间和精力;如果需要创建一个基于Excel的应用程序,但用户本身不熟悉Excel的功能,那么就可以针对特定的任务通过宏来创建一些具有引导功能的按钮和对话框来帮助这些用户完成相应的操作。

在办公室自动化中,Excel VBA是一个Excel可以依靠的非常重要的工具。而其中的宏录制器又是一个Excel可以依靠的非常重要的工具,用其可以通过鼠标和键盘执行的操作转换为Excel VBA代码,可以手动执行操作中的大部分都可以使用宏录制器来记录。这是一种快捷而简单的方式,不会编写VBA代码的用户也可以很快掌握。许多Excel用户记录并运行宏,甚至会产生没有必要学习VBA的感觉。事实上很多操作确实不需要专门学习,而熟练使用Excel宏录制器能够解决常见问题,也是学习VBA的一个捷径。

在本章中将说明如何使用宏录制器,以及运行宏的所有方式。读者将学习如何使用Visual Basic编辑器来检查和修改宏,从而不再受到宏录制器的限制。而且能够超出宏录制器有限的能力访问,并学会使用VBA语言和Excel对象模型的强大功能。

本章主要针对那些对Excel、Excel宏录制器或Visual Basic语言不熟悉的读者。

本章的知识点如下。

(1)使用Excel宏录制器。

(2)运行宏。

(3)认识VBA集成开发环境。

(4)定制VBA集成开发环境。

(5)使用系统帮助。

(6)认识信任中心。

1.1 使用宏录制器

在Excel中可以使用如下两种方法来创建一个宏。

(1)使用Excel宏录制器录制。

(2)使用VBA编写。

通过Excel宏录制器记录一个宏并不是最好的选择,并且一些宏是不能被录制的。但是对初学者来讲,录制的宏能够完成日常的很多操作,可以作为编程的参考。即便录制的宏并不是所需的,但是查看录制的程序代码也是学习VBA的重要方法之一。

1.1.1 录制宏

Excel的宏录制器就像录音机一样,在开始录制之前要想好需要录制的内容。为了录制的正确必须进行一定的排练,防止返工。然后打开录音机,并说出需要录制的内容。

录制一个宏的步骤如下。

决定需要使用宏执行的操作。

为录制宏做好准备,即演练操作过程,免得录制过程中操作顺序颠倒或遗漏。

决定在宏中的单元格引用是使用相对引用还是绝对引用(见1.1.4节)。

单击功能区中“开发工具”选项卡|“代码”组|“录制宏”按钮 (或单击状态栏中的“录制宏”按钮),Excel将显示宏录制器。

输入宏名、快捷键、保存位置及说明,除了宏的名称外,其他都是可选的。

单击“录制新宏”对话框中的“确定”按钮,Excel将自动插入一个VBA模块。借此Excel将用户的操作转换为VBA代码,同时也会在状态栏中显示一个“停止录制”按钮。

通过鼠标或键盘来执行需要录制的操作。

在完成操作之后,单击功能区中“开发工具”选项卡|“代码”组|“停止录制”按钮 (或单击状态栏中的“停止录制”按钮 )。

测试宏以确保其能够正确运行。

1.1.2 确保“开发工具”选项卡可见

在Excel界面中,与Excel VBA操作紧密相关的除了上一节介绍的在状态栏中显示的录制与停止录制命令按钮之外,最重要的就是“开发工具”选项卡。所以在开始学习VBA之前,要确保“开发工具”选项卡出现在功能区之上。Excel在默认安装后,并不显示该选项卡,执行如下行操作以显示此选项卡。

单击“Microsoft Office”按钮 ,然后单击“Excel选项”,打开如图1-1所示的“Excel选项”对话框。

图1-1 “Excel选项”对话框

选择“常用”类别中“使用Excel时采用的首选项”选项组中的“在功能区中显示‘开发工具’选项卡”复选框,然后单击“确定”按钮。

1.1.3 成功录制宏的因素

录制宏的成功与否取决于如下5个因素。

(1)在开始录制宏时工作簿的状态。

(2)在开始录制时的选择对象。

(3)使用绝对录制还是相对录制模式。

(4)录制操作的准确性。

(5)重播录制宏时的内容。

1.1.4 录制模式:相对模式或绝对模式

在录制操作时,Excel默认使用单元格的绝对引用录制模式,录制宏时应根据要执行的操作选择相对引用或绝对引用。

1.绝对录制模式

通过如下步骤以绝对模式录制一个简单的宏,在工作表中键入4个季度的名称。

单击功能区中的“开发工具”选项卡|“代码”组|“录制宏”按钮 ,显示如图1-2所示的“录制新宏”对话框。

图1-2 “录制新宏”对话框

在“宏名”文本框中输入“绝对模式”。

单击“确定”按钮开始录制。

激活单元格A1,并输入“第一季度”。

移动到B1,输入“第二季度”。

移动到C1,输入“第三季度”。

移动到D1,输入“第四季度”。

单击单元格A1,重新激活该单元格。

关闭宏录制器。

按Alt+F11快捷键以激活VBE。

查看模块1中的代码。

代码如下:

        Sub 绝对模式()
        '
        ' 绝对模式 Macro
        '
        '
            Range("A1").Select
            ActiveCell.FormulaR1C1 = "第一季度"
            Range("B1").Select
            ActiveCell.FormulaR1C1 = "第二季度"
            Range("C1").Select
            ActiveCell.FormulaR1C1 = "第三季度"
            Range("D1").Select
            ActiveCell.FormulaR1C1 = "第四季度"
            Range("A1").Select
        End Sub

在执行时该宏选择单元格A1,并在区域A1:D1区域中输入4个季度名,然后重新激活单元格A1。

在执行宏时,重复执行同样的操作,而与当前激活的单元格无关。在执行一个使用绝对引用录制的宏时,总是生成同样的结果,在本例中的宏总是在区域A1:D1中输入4个季度名。

2.相对录制模式

在某些情况下,需要录制的宏以相对模式处理单元格位置。即从当前激活单元格,而不是从某一个固定单元格中开始输入季度名。在这种情况下,可以使用相对录制。

可以通过代码“开发工具”选项卡“代码”组中的“使用相对引用”按钮 来改变录制模式。该按钮是一个切换按钮,如果显示为按下状态,则表示相对录制模式;如果以正常形式显示,则使用的是绝对录制模式。

提示

可以在任何时候,甚至录制过程中改变录制模式。

为要查看相对录制模式的作用,首先清除A1:D1单元格中的内容,然后执行如下操作

选择单元格A1。

单击功能区中的“开发工具”选项卡|“代码”组|“录制宏”按钮 ,显示“录制新宏”对话框。

在“宏名”文本框中输入“相对模式”。

单击“确定”按钮开始录制。

单击功能区中的“开发工具”选项卡|“代码”组|“使用相对引用”按钮

激活单元格A1,并输入“第一季度”。

移动到B1,输入“第二季度”。

移动到C1,输入“第三季度”。

移动到D1,输入“第四季度”。

单击单元格A1,重新激活该单元格。

关闭宏录制器。

在本例中,在录制之前激活了需要输入季度名的首单元格A1,在后面录制中的单元格引用都是基于该激活单元格。

该宏总是从当前激活单元格开始输入文本,将鼠标指针移到任何一个单元格。然后执行相对引用的代码,总是会从当前激活单元格开始输入季度名。

使用这种模式生成的如下录制代码和绝对模式有很大差别:

        Sub 相对模式()
        '
        ' 相对模式 Macro
        '
        '
            ActiveCell.FormulaR1C1 = "第一季度"
            ActiveCell.Offset(0, 1).Range("A1").Select
            ActiveCell.FormulaR1C1 = "第二季度"
            ActiveCell.Offset(0, 1).Range("A1").Select
            ActiveCell.FormulaR1C1 = "第三季度"
            ActiveCell.Offset(0, 1).Range("A1").Select
            ActiveCell.FormulaR1C1 = "第四季度"
            ActiveCell.Offset(0, -3).Range("A1").Select
        End Sub

为测试该代码,激活除A1外的任何单元格,季度名将从当前激活单元格开始的向右扩展的4个单元格区域中输入4个季度名。

提示

使用宏录制器生成的代码总是引用单元格A1,这看起来有些奇怪,因为在宏的录制过程中仅使用一次A1。简单说来这就是宏录制器工作的一个副产品,在以后的章节中会详细介绍。

3.查看录制代码

当打开宏录制器时,Excel会将用户的鼠标和键盘操作转换为合法的VBA代码。了解这个过程的最好的方式是逐步观察宏录制器(图1-3和图1-4所示分别为在操作Excel应用程序界面的同时观察每一步生成的VBA代码)。

图1-3 左右并排放置Excel和VBE窗口以观察每一步生成的宏代码

图1-4 上下并排放置Excel和VBE窗口以观察每一步生成的宏代码

执行如下操作

打开一个空白工作簿。

确保Excel窗口没有最大化。

按Alt+F11快捷键以激活VBE,确保该编程窗口也没有最大化。

重新设置Excel和VBE窗口的大小和位置,以便同时能看到两个窗口。

用户可以根据自己的显示器宽高尺寸比例情况,及喜好来选择将Excel和VBE窗口左右或上下并排放置,然后在运行时最小化任何其他应用程序。

激活Excel,单击功能区中的“开发工具”选项卡|“代码”组|“录制宏”按钮

单击“确定”按钮以启动宏录制器。

Excel将插入一个新的名为“模块1”的模块,并在其中开始录制。

按Alt+F11快捷键以激活VBE。

在工程资源管理器窗口中双击“模块1”显示“代码”窗口。

现在可以在执行各种Excel操作,如选择单元格、输入数据、格式化单元格、创建图表及处理图形对象等。并可以在VBE窗口中观察处理这些对象的VBA代码,这是一种学习了解VBA中的Excel对象的非常好的方式。

1.1.5 录制选项

单击功能区中的“开发工具”选项卡|“代码”组|“录制宏”按钮 ,显示如图1-5所示的“录制新宏”对话框。

图1-5 “录制新宏”对话框

该对话框中的选项如下。

(1)“宏名”文本框。

在其中为录制的 Sub 过程输入一个名字(即宏名),默认为Macro1及Macro2等,通常使用默认名即可。如果需要在以后继续使用该宏,则可以为其命名一个有意义的名称,如在前面示例中的“绝对模式”和“相对模式”。

提示

宏名的命名规则为最长为255个字符,并且其中一定不能有特殊字符,如感叹号(!)或问号(?),也不能包括空格。最好使用有意义的名称的缩写,这样有助于以后重复使用该宏。可以使用下画线以分隔单词或使用大写来区分单词等,请阅读3.1.1一节。

(2)“快捷键”文本框。

该文本框定义执行宏的快捷键组合,而且这种快捷键区分大小写。例如,键入 w(小写),那么按Ctrl+w快捷键执行该宏;键入W(大写),按Ctrl+Shift+w快捷键来执行该宏。

提示

可以在任何时候添加或改变快捷键。

(3)“保存在”下拉列表框。

所有的宏都保存在工作簿中,可以在该下拉列表框中选择保存录制宏的位置,默认为当前活动工作簿的一个模块中。有如下3个位置可供选择。

● 新工作簿:如果选择该选项,则录制器将为宏重新打开一个新的空工作簿。

● 个人宏工作簿:该工作簿指向一个特殊的隐藏工作簿,将在后面介绍。

● 当前工作簿:默认选项,即将宏保存在当前激活工作簿中。

个人宏工作簿是一个隐藏工作簿,在Excel启动时自动运行,命名为“Personal.xlsb”。如果选择将录制的宏保存在其中,则被添加到名为“Personal.xlsb”的特殊文件中,这是一个保存在Excel Startup目录下的隐藏文件。每次打开Excel后都会自动加载Personal.xlsb,这就意味着保存在个人宏工作簿中的宏就可以被其他所有工作簿使用。

如果Personal.xlsb不存在,那么宏录制器将创建一个。可以单击功能区中“视图”选项卡中的“取消隐藏”按钮来查看该工作簿,其保存可以供各个工作簿使用的宏,在VBA编辑器中可以查看和修改Personal.xlsb中的宏。

可以在Personal.xlsb的工作表中添加数据,然后使用“视图”选项卡再次隐藏该工作簿。如果创建一个通用功能宏,那么可以存储在Personal.xlsb工作簿中以便为其他任何工作簿使用;如果该宏仅与当前工作簿相关,那么存储在当前工作簿中即可。

(4)“说明”文本框。

在记录一个宏时以注释行开始,即 3 个空白行分别显示宏名、用户名和日期。可以在其中放置任何内容或为空。在编辑程序或者录制多个常用宏时,就需要为录制的宏添加较为详细的说明,这样方便后的调用。

1.1.6 完成录制

在“录制新宏”对话框完成设置后,单击“确定”按钮,一个新的“停止录制”按钮出现在屏幕上状态栏的左下角。功能区中的“开始录制”按钮也更换成一个新的“停止录制”按钮 ,如图1-6所示。

图1-6 “停止录制”按钮

在A1:D1中输入4个季度名之后重新选择A1单元格,或者单击功能区中的“停止录制”按钮 或状态栏中的“停止录制”按钮停止录制。

提示

一定要记住关闭宏录制器;否则就会导致一个死循环,即宏录制器不断运行自身。如果发生这种情况,或在测试宏时发生某些错误,那么按 Ctrl+Break 快捷键,然后选择“结束”或“调试”宏。也可以通过Esc键截获宏。

不能将工作簿保存储为默认(*.xlsx)类型,因其不允许包括宏。可以保存为一个允许宏的工作簿类型(*.xlsm),即XLM格式。或保存为一个Excel二进制工作簿格式(*.xlsb),这些文件类型都和早期版本的Excel兼容。另外一个选择是保存为Excel 97/2003工作簿类型(*.xls),从而生成一个与Excel 97/2003兼容的工作簿。

1.1.7 编辑代码

录制一个宏时,宏录制器生成了大量冗余代码,大大地影响了代码的执行效率。

为了更好地使用VBA代码,往往都需要编辑宏录制器生成的宏代码。

下例录制将打印纸张设为A4的操作的宏,操作步骤如下

单击功能区中的“开发工具”选项卡|“代码”组|“录制宏”按钮 ,打开“录制新宏”对话框,单击“确定”按钮开始录制。

单击功能区中“页面布局”选项卡|“页面设置”组|“纸张大小”按钮,然后选择“A4”选项。

关闭宏录制器。

按Alt+F11快捷键激活VBE,在工程资源管理器窗口中双击“模块1”以显示“代码”窗口,在其中可以看到非常简单的操作生成了如下庞大的代码:

        Sub Macro5()
        '
        ' Macro5 Macro
        '
        '
            With ActiveSheet.PageSetup
              .PrintTitleRows = ""
              .PrintTitleColumns = ""
            End With
            ActiveSheet.PageSetup.PrintArea = ""
            With ActiveSheet.PageSetup
              .LeftHeader = ""
              .CenterHeader = ""
              .RightHeader = ""
              .LeftFooter = ""
              .CenterFooter = ""
              .RightFooter = ""
              .LeftMargin = Application.InchesToPoints(0.7)
              .RightMargin = Application.InchesToPoints(0.7)
              .TopMargin = Application.InchesToPoints(0.75)
              .BottomMargin = Application.InchesToPoints(0.75)
              .HeaderMargin = Application.InchesToPoints(0.3)
              .FooterMargin = Application.InchesToPoints(0.3)
              .PrintHeadings = False
              .PrintGridlines = False
              .PrintComments = xlPrintNoComments
              .PrintQuality = 300
              .CenterHorizontally = False
              .CenterVertically = False
              .Orientation = xlLandscape
              .Draft = False
              .PaperSize = xlPaperA4
              .FirstPageNumber = xlAutomatic
              .Order = xlDownThenOver
              .BlackAndWhite = False
              .Zoom = 100
              .PrintErrors = xlPrintErrorsDisplayed
              .OddAndEvenPagesHeaderFooter = False
              .DifferentFirstPageHeaderFooter = False
              .ScaleWithDocHeaderFooter = True
              .AlignMarginsHeaderFooter = True
              .EvenPage.LeftHeader.Text = ""
              .EvenPage.CenterHeader.Text = ""
              .EvenPage.RightHeader.Text = ""
              .EvenPage.LeftFooter.Text = ""
              .EvenPage.CenterFooter.Text = ""
              .EvenPage.RightFooter.Text = ""
              .FirstPage.LeftHeader.Text = ""
              .FirstPage.CenterHeader.Text = ""
              .FirstPage.RightHeader.Text = ""
              .FirstPage.LeftFooter.Text = ""
              .FirstPage.CenterFooter.Text = ""
              .FirstPage.RightFooter.Text = ""
          End With
        End Sub

这是宏录制器生成执行过多冗余操作代码的很好例证。如果仅仅是设置打印纸张大小,可以将代码简化如下,使其码具有更高的可读性:

        Sub Macro5()
            With ActiveSheet.PageSetup
              .PaperSize = xlPaperA4
            End With
        End Sub

在上面的代码中删除了除设置纸张打印大小属性PaperSize之外的其他属性和代码行。由于在这段程序中只设置一个属性,不需要使用With…End With结构体,所以可以简化成以下的代码:

        Sub Macro5()
            ActiveSheet.PageSetup.PaperSize = xlPaperA4
        End Sub

在本例中,宏仅改变了当前工作表上的PageSetUp对象的PaperSize属性xlPaperA4是一个内置的常量。

当然也可以不必使用宏录制器,而是直接在模块中键入代码,为此需要知道在VBA中将需要操作的对象及其属性或方法。尽管宏录制器并不能准确提供用户所需的代码,但是可以从中获取非常有用的信息,如在本例中通过录制宏知道了设置 PaperSetup 对象的PaperSize 属性即可。同时宏录制器录制了多个无关的属性和方法,它们与设置对话框中的属性方法往往是一一对应的。如果仔细阅读这些代码,则能够对Excel中VBA的对象以及其属性方法有更深入的理解。

1.1.8 录制宏的限制

宏录制器适合录制简单且直接的宏,例如,格式化所选区域操作的宏。

宏录制器仅适用于Sub过程,而不能用来创建函数过程。

宏录制器对开发更复杂的宏也有帮助,通常可以记录一些简单的操作,然后将录制的代码复制粘贴到另外一个更复杂的宏中。在多数情况下,需要编辑录制的代码,并添加一些新的VBA语句。

宏录制器不能为以下的任何一个任务生成代码。

(1)执行任何类型的重复性循环操作。

(2)执行任何类型的条件性操作(使用一个If…Then语句)。

(3)将值分配给变量。

(4)指定数据类型。

(5)显示弹出式信息。

(6)显示自定义对话框。

通过宏录制器录制在Excel中的操作也许是掌握VBA最好的方式,尽管结果不是实际所需的,但是可以通过查看录制的代码来找出执行操作的关键词等线索。

1.1.9 安全性问题

1.设置“禁用所有宏,并发出通知”选项

当VBA宏被某些病毒作为一种传播方式之后,Microsoft更改默认的安全设置以阻止宏运行。为了使用录制的宏,需要调整宏安全性设置,步骤如下。

单击“Microsoft Office”按钮 ,然后单击“Excel选项”打开如图1-7所示的“Excel选项”对话框,切换到“信任中心”类别。

图1-7 “Excel选项”对话框

单击右下角的“信任中心设置”按钮,然后单击“确定”按钮,打开图1-8所示的“信任中心”对话框。

图1-8 “信任中心”对话框

选中“禁用所有宏,并发出通知”单选按钮。

单击“工具”|“宏”|“安全性”命令,打开如图1-9所示的“安全性”对话框,其中一般推荐选择“中,您可以选择是否运行可能不安全的宏”单选按钮。

图1-9 “安全性”对话框

单击“确定”按钮,单击“Microsoft Office”按钮。然后选择“另存为”选项,打开“另存为”对话框,选择“Excel 启用宏的工作簿(.xlsm)选项”,并将工作簿保存为“Recorder.xlsm”。

提示

从录制宏开始,在Excel 2007中宏一直可以运行;在Excel 2003中,如果未设置安全当选项为中或低,则无法运行。

打开Recorder工作簿,在编辑栏上方显示安全警告,如图1-10所示。

图1-10 安全警告

单击安全警告部分的“选项”按钮,弹出图1-11所示的“Microsoft Office安全选项”对话框。选择“启用此内容”单选按钮,然后单击“确认”按钮运行宏,弹出图1-12所示的提示框。

图1-11 “Microsoft Office安全选项”对话框

图1-12 禁用宏信息提示

如果需要关闭图1-10所示的提示框,则单击功能区上“开发工具”选项卡|“宏安全性”按钮。弹出“信任中心”对话框。选择“宏设置”类别,启用所有宏。但是不建议使用,因为可能会运行宏病毒。

一个更好的选择是指定一个信任位置,为此单击“信任中心”对话框中的“信任位置”选项。单击“新位置”按钮来指定受信任的存储工作簿的新位置,然后将包括新录制的宏的工作簿保存在该位置。

提示

如果在“另存为”对话框中未显示文件的扩展名(如.xlsm),应该打开资源管理器。然后单击“工具”|“文件夹”选项,在“视图”选项卡中选择“显示已知文件的扩展名”复选框。

1.2 运行宏

调用运行宏的常用方法有如下6种。

(1)“宏”对话框。

(2)快捷键。

(3)表单控件。

(4)ActiveX控件。

(5)快速访问工具栏。

(6)VBE窗口。

提示

本节示例请参见光盘中的“Recorder.xlsm”工作簿。

1.2.1 打开“宏”对话框的方式

可以通过“宏”对话框来运行宏,打开方式如下。

单击功能区上“视图”选项中上的“宏”按钮

单击“开发工具”选项卡中的“宏”按钮

按快捷键Alt+F8。

打开的“宏”对话框如图1-13所示,双击宏名,或单击宏名,然后单击“执行”按钮运行宏。

图1-13 “宏”对话框

1.2.2 快捷键方式

可以通过按在录制宏时指定的快捷键来运行宏,

如在“宏”对话框中。选择宏名,然后单击“选项”按钮,显示如图1-14所示的“宏选项”对话框。

图1-14 “宏选项”对话框

在其中可以为同一工作簿中的多个宏分配同样的快捷键(尽管在录制宏时不如此处理)。

提示

也有可能在不同工作簿中包括指定了相同快捷键的宏,在这种情况下,按照宏名的字母顺序运行排在前面的宏。

快捷键适用于需要频繁启动的宏,尤其是对于习惯使用键盘的用户。此外,可以通过添加到工作表中的按钮启用宏。

提示

注意分配给宏的快捷键的大小写问题,如果在“宏选项”中添加的字母是小写的,那么按Ctrl和该字母即可实现调用;如果是大写,那么需要按Ctrl、Shift和该字母3个键。

1.2.3 表单控件方式

如果需要固定在某张工作表中运行某个宏,那么可以考虑使用“表单控件方式”,步骤如下。

单击功能区上“开发工具”选项卡|“控件”组|“插入”命令,弹出如图1-15所示的“表单控件”和“ActiveX控件”下拉列表。

图1-15 “表单控件”和“ActiveX控件”下拉列表

单击“表单控件”部分的命令按钮 ,鼠标指针变成“+”形状。在工作表的适当位置拖动绘制一个大小适当的按钮表单控件,弹出如图1-16所示的“指定宏”对话框。

图1-16 “指定宏”对话框

在“宏名”下拉列表框中选择已经存在的宏(本例中将选择“相对模式”宏),也可以通过“新建”或“录制”按钮创建新的宏。

在“按钮 1”仍处于选择状态下,单击该按钮控件,输入名字“表单控件”。然后按回车键,则控件的名字更改为“表单控件”。

在工作表Sheet2中添加一个名为“表单控件”的表单按钮控件,并为其指定宏“相对模式”。单击该控件运行宏“相对模式”,如图1-17所示。

图1-17 通过命令表单控件运行宏

1.2.4 ActiveX控件方式

为使用ActiveX控件方式,执行如下步骤。

单击功能区上“开发工具”选项卡|“控件”组|“插入”命令,弹出如图1-15所示的“表单控件”和“ActiveX控件”下拉列表。

单击“ActiveX 控件”部分的命令按钮 ,鼠标指针变成“+”形状。在工作表的适当位置拖动绘制一个大小适当的按钮ActiveX控件。成功添加一个按钮ActiveX控件。

右击该按钮,选择快捷菜单中的“属性”命令,弹出如图1-18所示的“属性”对话框。将“Caption”(标题)属性设置为“ActiveX控件”,然后关闭对话框。

图1-18 “属性”对话框

双击该ActiveX命令按钮,打开图1-19所示的VBE界面。

图1-19 VBE界面

在图中所示的CommandButton1_Click事件过程中添加如下调用“相对模式”过程的代码:

        Private Sub CommandButton1_Click()
            Call 相对模式
        End Sub

在工作表Sheet2中成功添加一个名为“表单控件”的表单按钮控件,并为其指定宏“相对模式”。单击该控件运行宏“相对模式”,如图1-20所示。

图1-20 通过命令ActiveX控件运行宏

1.2.5 快速访问工具栏方式

当某个宏的使用频率很高时,可以在“快速访问工具栏”中添加一个按钮,步骤如下。

右击“快速访问工具栏”,弹出图1-21所示的快捷菜单。

图1-21 快捷菜单

单击其中所示的“自定义快速访问工具栏”命令,打开“Excel 选项”对话框。如图1-22所示。切换到“自定义”类别,在“从下拉位置选择命令”下拉列表框中选择“宏”选项。在随之出现的列表框中选择需要添加的宏,然后单击“添加”按钮。如果该设置仅用于本工作簿,则在“自定义快速访问工具栏”处的下拉列表框中选择“用于×××”(XXX为所需的工作簿名字,此处为“Recorder.xlsm”)选项。

图1-22 “Excel选项”对话框

图1-23 改变分配给宏的按钮图标

将所需宏添加到“快速访问工具栏”中,然后可以通过图“Excel 选项”对话框中的“修改”按钮,修改分配给宏按钮图标。

单击该按钮,打开图1-24(左)所示的“修改按钮”对话框,可在其中选择所需的图标,如 ,并且将显示名称由“相对模式”改为“键入季度”。单击“确定”按钮返回“Excel选项”对话框,单击“确定”按钮,结果如图1-24(右)所示。

图1-24 “修改按钮”对话框及添加结果

1.2.6 VBE窗口方式

在图1-25中所示的VBE窗口中,有以下3种方式运行鼠标指针所在的宏过程。

图1-25 VBE窗口

单击“调试”工具栏中的“运行”按钮。

按快捷键F5。

单击“运行”|“运行子过程”|“用户窗体”命令。

1.3 VBA集成开发环境

VBA集成开发环境(VBE)是一个可以编写和编辑VBA宏的独立应用程序,可与Excel无缝工作,即在需要时在Excel中打开VBE。

提示

不能单独运行VBE,它必须在Excel打开的情况下运行。

1.3.1 访问VBA集成开发环境

使用VBA创建工程之前,必须首先认识VBE(集成开发环境),可以在Excel中以多种方式访问VBE。

单击“开发工具”选项卡|“代码”组|“Visual Basic”按钮,如图1-26所示。

图1-26 在“开发工具”选项卡中访问VBE

按快捷键:Alt + F11。

提示

在VBE中可以使用Alt + F11快捷键返回Excel用户界面。

1.3.2 IDF中的各组件

打开VBE,显示与图1-27所示类似的窗口。

图1-27 VBA集成开发环境

VBE还有其他组成部分,请参见第10章中的有关内容,本节介绍如下部分。

1.菜单栏

VBE菜单栏包括操作VBE中与各个组件相关的命令。

提示

VBE中也有快捷菜单,可以右击VBE,然后会弹出一个有相应命令组成的键快菜单。

VBE中提供了“编辑”、“标准”、“调试”及“用户窗体”4个工具栏,可以定制移动,并且显示或隐藏该工具栏。可以通过单击“视图”|“工具栏”中的选菜单项来控制。

3.“工程资源管理器”窗口

“工程资源管理器”窗口显示一个在当前应用程序中打开的每个工作簿(包括加载项和隐藏工作簿)的一个树状层次结构图,双击这些项目以扩展或压缩项目。

如果“工程资源管理器”窗口不可见,则按Ctrl+R快捷键或单击“视图”|“工程资源管理器”命令使其可见;要隐藏该窗口,单击其标题栏中的关闭按钮或右击该窗口,然后单击快捷菜单中的“隐藏”命令。

4.“代码”窗口

一个“代码”窗口(有时也称为“模块窗口”)包括 VBA 代码,工程中的每个对象都有与之相关联的“代码”窗口。要查看一个对象的“代码”窗口,可以在“工程资源管理器”窗口中双击该对象。例如,要查看ThisWorkbook的“代码”窗口,在“工程资源管理器”窗口中双击ThisWorkbook。在其中添加VBA代码后,该“代码”窗口才不为空。

5.“立即”窗口

如果“立即”窗口不可见,则按Ctrl+G快捷键或单击“视图”|“立即”窗口命令使其可见;要隐藏该窗口,单击其标题栏中的关闭按钮可,或右击该窗口,然后单击快捷菜单中的“隐藏”命令。

“立即”窗口在直接执行VBA语句和调试代码时非常有用,请参阅第10章中的有关内容。

提示

Excel 2007 的用户界面变化很大,特别是使用功能区替换了传统的菜单和工具栏界面。VBA语言也相应更新以适应新的Excel功能特性,但是VBE没有任何变化。

1.3.3 “工程资源管理器”窗口

“工程资源管理器”窗口如图1-28所示,它一般位于IDE 窗口的左上角,其中列出了当前打开的所有工程及其组件。例如,图中显示当前一个名为“Book1”的工作簿的一个工程,该工程拥有的组件为 Sheet1、Sheet2、Sheet3、ThisWorkbook、一个窗体组件UserForm1、两个标准模块模块1和模块2,以及一个类模块类1。

图1-28 “工程资源管理器”窗口

该窗口显示工程的一个分层结构列表及包含在并且被每一个工程引用的全部工程。可以通过工程名前面的加号(+)展开该工程,并通过减号(-)以折叠该工程,或是通过双击某项目以展开或折叠该项目。

每个工程都可以扩展,以展示至少一个名为“Microsoft Excel”对象的节点,可通过扩展该节点以查看工作簿中的每个工作表(每一个对象)。也可以看到另外一个名为“ThisWorkbook”的对象,该对象代表工作簿对象。如果工程包括任何 VBA 模块,工程列表将会显示一个模块节点。工程列表中同样也可以包括名为“窗体”的节点,包括用户窗体对象。

(1)打开方式。

● 菜单方式:“视图”|“工程资源管理器”命令。

● 工具栏按钮方式:

● 快捷键:CTRL+R。

(2)窗口部件。

● “查看代码” 按钮。

单击此按钮打开“代码”窗口

● “查看对象” 按钮。

单击此按钮显示在列表窗口中所选择的工程,可以是工作表、工作簿或用户窗体的对象窗口。对于无图形界面的标准模块和类模块等此按钮不可用。

● “切换文件夹”

工程资源管理器将其中包含的对象分为Microsoft Excel对象、窗体、模块、类模块及引用等类,并分别放置在不同的文件夹目录下。单击该按钮可以在分类和不分类放置对象两种状态间切换。即单击此按钮以显示包括各类工程对象的文件夹,如图1-29(左)中的“切换文件夹” 按钮处于选中状态(默认设置),同时显示了包括Microsoft Excel对象、窗体对象等的文件夹;而图1-29(右)中的“切换文件夹” 按钮处于非选中状态,未显示包括Microsoft Excel对象及窗体对象等的文件夹。

图1-29 显示文件夹和不显示文件夹

● 列表窗口。

列出所有已装入的工程以及工程中的子工程,在该窗口中可能出现的工程对象如表1-1所列:

表1-1 列表窗口可能出现的工程对象

执行如下操作可将一个新的VBA模块添加到一个工程中。

单击“工程资源管理器”窗口工程名或该工程内的任一组件。

单击“插入”|“模块”命令。

或右击“工程资源管理器”窗口中工程的名称或其任一组件,然后单击快捷菜单中的“插入”|“模块”命令。

提示

录制一个宏时,Excel会自动插入一个VBA模块以存放录制的代码。模块的位置取决于开始录制时用户所选择的文件夹。

4.移除一个VBA模块

执行如下操作可将一个新的VBA模块添加到一个工程中。

单击“工程资源管理器”窗口中需要移除的模块名。

单击“文件”|“移除×××”命令(其中×××为所需移除的模块名。如要移除图1-29 中所示的模块 1,选中该模块,就会出现“移除模块 1”命令,单击该命令即可)。也可以右击“工程资源管理器”窗口中需要移除的模块名,然后单击快捷菜单中的“移除× ××”命令。

5.导出和导入对象

VBA工程中的每个对象均为导出和导入。如果需要在不同工程中重复使用某个对象(如一个VBA模块或用户窗体),则导入和导出十分有用的。

执行如下操作来导出一个对象。

在“工程资源管理器”窗口中选择一个对象。

单击“文件”|“导出文件”命令或按Ctrl+E快捷键。

提示

将打开一个询问文件名的对话框,注意对象仍在工程中,只是导出了一个该对象的备份。

可执行如下操作导入一个对象。

单击“工程资源管理器”窗口中的工程名或本工程中的任意一处。

单击“文件”|“导入文件”命令或按Ctrl+M快捷键。

提示

将打开到一个询问文件的对话框、应该仅导入一个通过“文件”|“导出文件”命令导出的文件。

1.3.4 “属性”窗口

如图1-30所示的“属性”窗口列出在“工程资源管理器”窗口所选对象,如窗体、控件、类、工程或模块对象的设计时属性,可以在设计时改变这些属性。当选择多个控件时,属性窗口会列出所有控件都具有的公有属性。

图1-30 “属性”窗口

1.打开方式

(1)菜单方式:“视图”|“属性”命令。

(2)工具栏按钮

(3)快捷键:F4。

2.窗口部件。

(1)对象框:列出当前“工程资源管理器”窗口中的所选对象。

(2)属性列表:如果选择多个对象,则会以第 1 行对象为准列出各对象均具有如下的属性。属性列表有如下两种视图模式选项卡。

● “按字母序”选项卡:按字母顺序列出所选的对象的所有属性(如图1-30所示)。要改变属性定,可以在对应属性名后的文本框中输入,或直接选择新的设定。

● “按分类序”选项卡:根据性质列出所选对象的所有属性,如图1-31所示,其中列出了用户窗体上标签 Label 的所有属性。例如,AutoSize、Enabled、TextAlign 和WordWrap属于标签Label对象的行为方面的属性,所以归类到“行为”分类;Picture和 PicturePosition 属于标签 Label 的图片方面的属性,所以归类到“图片”分类;BackColor、Caption及ForeColor是属于外观的属性,所以归类到“外观”分类中。

图1-31 按照分类序列出的属性列表

在该选项卡中,单击分类名称左边的减号以折叠该列表,即只看到分类;单击加号展开该列表时候,即看到该分类下的所有属性。

1.3.5 “对象浏览器”窗口

如图1-32所示的“对象浏览器”窗口显示对象库及工程过程中的可用类、属性、方法、事件及常数变量。可以用其来搜索及使用已有的对象,或来源于其他应用程序的对象。

图1-32 “对象浏览器”窗口

(1)菜单方式:“视图”|“属性”命令。

(2)工具栏按钮:

(3)快捷键:F4。

2.窗口部件

(1)工程/库下拉列表框。

其中显示活动工程的当前所引用的库。可以在“引用”对话框中添加库,第 1 个选项“<所有库>”显示所有的库。

(2)搜索文本框。

其中包含要用来做搜索的字符串,可以键入或选择所要的字符串。搜索文本框中将默认保留最后 4 次输入的搜索字符串,直到关闭此工程为止。在键入字符串时,可以使用标准的Visual Basic通配符。

如果要查找完全相符的字符串,可以用快捷菜单中的“全字匹配”命令。

(3)向后按钮

可以向后回到前一个类及成员列表,每单击一次向后一个选项,直到最后。

(4)向前按钮

每次单击可以重复原本选择的类及成员列表,直到选择列表用完。

(5)复制到剪贴板按钮

将成员列表中的选择或详细框中的文本复制到剪贴板,可在之后粘贴到代码中。

(6)查看定义按钮

将光标移到“代码”窗口中,定义成员列表或类列表中选定的位置。

(7)帮助按钮

显示在类或成员列表中,选定工程的联机帮助主题,也可以使用 F1键。

(8)搜索按钮

激活类或属性、方法、事件或常数等符合在搜索文本框中键入字符串的库搜索,并且打开有适当信息列表的搜索结果框。

(9)显示/隐藏搜索结果按钮

打开或隐藏搜索结果列表框,其中显示从工程/库下拉列表框中所选出的工程或库的搜索结果。搜索结果会默认按类型创建组并从A~Z排列。

(10)搜索结果列表框。

其中显示搜索字符串所包含工程的对应库、类及成员,搜索结果列表框在改变工程/库下拉列表框中的选择时改变。

(11)类列表框。

其中显示在工程/库下拉列表框中选定的库或工程中所有可用的类,如果有代码编写的类,则这个类会以粗体方式显示。这个列表的开头都是<globals>,即可全局访问的成员列表。

如果选择了类,但没有选择特定的成员,会得到默认成员,它以星号(*)或以此成员特定的默认图标为标识。

(12)成员列表框。

按组显示在类列表框中所选类的元素,在每个组中按字母排列。用代码编写的方法、属性、事件或常数会以粗体显示,可用“对象浏览器”的快捷菜单中的“组成员”命令改变此列表顺序。

(13)详细数据列表框。

其中显示成员定义,其中框包含一个跳转,以跳到该元素所属的类或库,某些成员的跳转可跳到其上层类。例如,如果该列表框中的文本提到Command1声明为命令按钮类型,单击命令按钮可以到“命令按钮”类。

可以将详细数据列表框中的文本复制(或拖动)到“代码”窗口中。

(14)拆分条。

拆分条用于调整框的大小,位于类框及成员框、搜索结果列表及类与成员框,以及类与成员及详细数据框之间。

3.VBE开发环境中各窗口中的常用图标

在VBE开发环境中各窗口的常用图标及其意义如表1-2所示。

表1-2 常见图标及其意义

1.3.6 “代码”窗口

可以使用如图1-33所示的“代码”窗口来编写、显示并编辑Visual Basic代码,打开各模块的“代码”窗口后可以查看不同窗体或模块中的代码,并且在这些不同工程组件的“代码”窗口之间复制和粘贴代码。

图1-33 “代码”窗口

(1)在“工程资源管理器”窗口中选择一个窗体或模块,然后单击“查看代码”按钮。

(2)在“用户窗体”窗口中双击控件或窗体。

(3)单击“视图”|“代码”窗口命令。

(4)按F7键。

2.窗口部件

(1)对象下拉列表框

其中包含所有与“代码”窗口有关的对象的名称,显示所选对象的名称。

普通标准代码模块在该下拉列表框中对应“通用”选项,类模块在其中显示为为该类模块中的与其相关的所有对象。

(2)过程/事件下拉列表框。

其中列出与对象下拉列表框中所选对象相关的过程,这些按名称的字母来排列。选择一个过程,指针会移到该过程的第1行代码上面。

对于类模块,对象下拉列表框中显示的为“通用”及和该类模块相关的所有对象名。如果显示的是“通用”,则过程/事件下拉列表框会列出所有声明,以及为此窗体所创建的常规过程。在其中选择一个过程,则所选的过程都会显示在“代码”窗口中;如果对象下拉列表框中显示的为某个对象的对象名,则过程/事件下拉列表框可以列出其所有VBA事件。当选择了一个事件,如果该事件已经创建并编写代码,选择该事件过程,则进入到已创建的事件过程的第 1 行代码处。如果尚未创建事件,则可以通过单击并选择事件名,自动创建该事件过程的第 1 行和最后一行代码,这也是创建事件过程的一个非常好的方法,可以避免因手工输入过程名及参数而可能引起的错误。

(3)拆分条。

向下拖动“代码”窗口中垂直滚动条右上角的拆分条,可以将“代码”窗口分隔成两个水平窗格。二者都具有滚动条,可以在同一时间查看代码中的不同部分。显示在对象下拉列表框及过程/事件下拉列表框中的信息,是以当前拥有焦点的窗格之内的代码为准。将拆分条拖放到窗口的顶部或下端或者双击拆分条,都可以删除拆分条,关闭一个窗格(如图1-34所示)。

图1-34 使用拆分条的“代码”窗口

(4)边界标识条

“代码”窗口的左边的灰色区域,其中会显示边界标识。

(5)“查看过程”按钮

单击该按钮,在“代码”窗口中显示所选过程,同一时间只能显示一个过程。

(6)“查看全模块”按钮

单击该按钮,在“代码”窗口中显示模块中的全部代码。

3.最小最大化窗口

打开多个工程时,VBA会有大量“代码”窗口,如图1-35所示。

图1-35 打开多个工程时的大量“代码”窗口

要最大化一个“代码”窗口,单击其标题栏中的最大化按钮或双击标题栏;要将一个“代码”窗口重置回其最初尺寸,单击标题栏中的还原窗口按钮。

要使两个或多个“代码”窗口同时可见,可以手动重新放置窗口,或单击“窗口”|“水平平铺”或“窗口”|“垂直平铺”命令来自动重新放置窗口。

重复按Ctrl+Tab快捷键,在所有打开的“代码”窗口中进换;按Ctrl+Shift+Tab快捷键以相反顺序切换。

要最小化窗口,单击窗口标题栏中的关闭按钮。要再次打开,双击“工程资源管理器”窗口中的对应对象即可。

4.创建一个模块

通常来说,一个VBA过程可以包含如下3种代码。

(1)声明:提供给VBA的一条或多条信息语句,例如,可以声明将要使用的数据类型或变量,或设置其他模块级选项。

(2)Sub过程:执行一些操作的编程指令集。

(3)Function过程:返回值的编程指令集,与工作表函数的概念类似,如SUM。

一个VBA过程可以包括任意数目的Sub过程、Function过程和声明,一般说来,可以根据代码使用目的分到不同的模块中。

5.将VBA代码放进一个模块中

可以通过如下种方式将VBA代码放进一个VBA模块中。

(1)直接输入。

(2)使用Excel宏录制器来录制操作并将其转换为VBA代码。

(3)从另外一个模块中复制代码,并粘贴到该模块。

使用 Tab 键将使某些行缩进以增强代码的可读性,这虽然不是必须的,但它是一个好的编辑习惯。

一行VBA代码可在达到一定长度时,最好使用换行符来换行,换行符由一个空格和一条下画线组成(_)。下面的语句被换行符分成6 行:

          ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
              False, AllowFormattingCells:=True, AllowFormattingColumns:=True,_
              AllowFormattingRows:=True, AllowInsertingColumns:=True, _
              AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, _
              AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:= True,_
              AllowUsingPivotTables:=True

如果认为如上的ActiveSheet的Protect方法的各参数项的设置仍然不够明确,可以将每个参数单独放在一行,如下所示:

              ActiveSheet.Protect DrawingObjects:=False, _
                          Contents:=True, _
                          Scenarios:=False, _
                          AllowFormattingCells:=True, _
                          AllowFormattingColumns:=True, _
                          AllowFormattingRows:=True, _
                          AllowInsertingColumns:=True, _
                          AllowInsertingRows:=True, _
                          AllowInsertingHyperlinks:=True, _
                          AllowDeletingRows:=True, _
                          AllowSorting:=True, _
                          AllowFiltering:=True, _
                          AllowUsingPivotTables:=True

使用换行符相连的语句与放在同一行上的未使用换行符的语句效果完全等同。注意在第1行代码下的各行使用相同缩进,使得这些行代码明显地基于第1行代码。

VBA允许多次撤销和重复,因此如果误删除一个语句,可以单击工具栏中的撤销按钮 。或按Ctrl+Z快捷键恢复。在执行撤销命令之后,可以单击重复按钮 来执行刚刚撤销的操作。

下面开始尝试键入一些代码:

在Excel中窗口打开一个新工作簿。

按Alt+F11快捷键激活VBE。

在“工程资源管理器”窗口中单击新工作簿的名字。

选择“插入”|“模块”命令在工程中插入一个新VBA模块。

在模块中键入如下代码:

        Sub SayHello()
            MsgBox "你好,朋友!"
        End Sub

将光标放到上面过程中,按F5键“运行”|“运行子过程/窗体”命令的快捷键。以运行该过程,显示如图1-36所示的消息框。

图1-36 消息框

在键入Sub语句后,VBE会自动插入一个End Sub语句。如果忽略了方法关键字和参数赋值之间的空格,则 VBE 会自动插入空格,VBE也会改变一些文本的大小写和颜色。VBE进行这些格式上的调整以使得代码更加整齐,并具有更高的可读性。

如果遵循前面的步骤仅写入一个VBA Sub过程,称之为“宏”。

上面这个宏尽管只有3行代码,但包括如下知识点。

(1)定义一个Sub过程(第1行)。

(2)使用一个内置的VBA函数(Msgbox)。

(3)结束一个Sub过程(最后一行)。

提示

无法通过宏录制器获取前面的 SayHello过程,显示一个消息框不是 Excel的常规功能,而由VBA来实现。宏录制非常有用,但是很多情况都需要手工键入一些代码。

下面将提供一个简单的录制一个关闭“网格线”宏的操作步骤,首先新建一个空白工作簿,然后开始执行如下操作。

激活工作表,并确保其中显示网格线。

单击“开发工具”选项卡|“代码”组|“录制新宏”命令,或单击状态栏左边的红色小圆点。

在“录制新宏”对话框中命名新宏为“网格线”,并使用Ctrl+w作为快捷键。

单击“确定”按钮开始录制。

Excel自动在当前活动工作簿工程中插入一个模块,并把操作转换为VBA代码,在录制中,状态栏中的带红色小圆点的窗口图标按钮变成绿色小方块,表示宏录制器正在运行,单击该绿色小方块将停止录制。

清除功能区上“视图”选项卡|“显示/隐藏”组|“网格线”复选框,工作表中的网格线消失。

单击“开发工具”选项卡|“代码”组|“停止录制”按钮。或单击状态栏上“停止录制”按钮,停止录制。

要查看录制的新代码,单击Alt+F11快捷键激活VBE。在工程资源管理器窗口中定位到该工作簿名,工程中有一个新的模块,其名称取决于用户是否有其他模块。如果没有,则该模块为“模块1”。以双击该模块进入该模块的“代码”窗口,如下是操作对应的代码:

        Sub 网格线()
        '
        ' 网格线 Macro
        '
        ' 快捷键: Ctrl+w
        '
            ActiveWindow.DisplayGridlines = False
        End Sub

要试验该宏,激活一个显示网格线的工作表,并按指定给该宏的快捷键Ctrl+w。

如果在前面未指定快捷键,可以执行如下步骤来运行。

单击“开发工具”选项卡|“代码”组|“宏”按钮或按快捷键Alt+F8,打开如图1-37所示的“宏”对话框。

图1-37 “用宏”对话框

单击“执行”按钮。

Excel将执行宏,网格线将会消失。

也可以使用宏录制器录制任意次数的操作,Excel 会将鼠标和键盘操作均转换为 VBA代码。

录制的宏并非万能,如可以简单地关掉网格线,而不需要使用宏。但是可以修改该宏以使其执行开/关网格线的切换。激活代码模块,将语句改为:

        '   ActiveWindow.DisplayGridlines = False
            ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines

提示

可以使用单引号(‘)来注释不需要的代码。

修改后的宏可以用做切换,如果显示网格线,该宏将会关闭网格线;否则使其可见。录制的宏相对于VBA代码有很多局限性,本例又是一个例证。即可以录制显示及关闭网格线的宏,但是不能录制一个切换网格线显示的宏。

可从其他模块复制VBA代码并粘贴到本模块。例如某个工程中的一个Sub或Function过程对另一个工程有用,则激活该过程所在模块,使用简单的复制粘贴功能即可。在将代码粘贴到目标模块中,就可以对代码进行修改并运行。

此外,还可以拖动所选代码文本到当前“代码”窗口中的不同位置、其他“代码”窗口、“立即”窗口,以及“监视”窗口和“回收站”中。

1.4 定制集成开发环境

为了更好地进行程序开发,可以通过“选项”对话框设置VBA开发环境的行为和外观。

在VBE处于激活状态时,单击“工具”|“选项”命令,打开图1-38所示的“选项”对话框。

图1-38 “选项”对话框

1.4.1 “编辑器”选项卡

“编辑器”选项卡主要用于设置“代码”及“项目”窗口。

其中的Tab宽度:设置定位点宽度,范围为1个~32个空格,默认为4个空格。

(1)“自动语法检测”复选框。

该复选框决定输入一行代码并按回车键后,如果发现了一个语法错误,是否弹出一个错误提示信息。如图1-39所示,为字符串变量sVal赋值,但是赋值字符串“测试”使用了中文状态下的双引号(“”),故产生了“无效字符”的语法错误。

图1-39 自动语法检测

提示

在VBE中编程要分别注意中英文字符和标点符号问题,应使用英文输入法下的单引号(‘)和双引号(“)。

选择该复选框,会将发生错误的语句置为红色并且弹出错误提示信息;否则只将发生错误的语句置为红色。

(2)“要求变量声明”复选框。

选择该复选框,VBA会在每一个新模块的标准声明中添加如下语句:

        Option Explicit

如果在模块中有“Option Explicit”,则其中强制要求必须声明每一个使用的变量;否则产生如图1-40所示的错误信息。

图1-40 未声明变量的错误提示信息

提示

使用显式变量声明是一个非常好的编程习惯,这样能避免出现不必要的程序错误。

(3)“自动列出成员”复选框。

选择该复选框,VBE将在用户键入VBA代码时提供帮助,在对象后输入点(.)后自动显示隶属于该对象的所有属性和方法的列表供选择。输入 ActiveCell 并输入点后出现了ActiveCell的属性和方法列表,如图1-41所示。

图1-41 自动列出对象和方法列表

此后若继续输入,列表会根据输入的字母而不断调整以将字母相同的关键字显示在前面。可以使用上下箭头键选择需要的属性或方法,然后按空格键,则当前被选择的属性或方法就输入到了代码中,非常方便,即能够很快找到对象的相应方法,也能够节省字符输入量。

提示

若自动列出的成员列表消失,可以删除对象后的点号,然后重新输入此时成员列表会再次出现。也可以使用如图1-42所示“编辑”工具栏的属性/方法列表按钮 ,或按快捷键Ctrl+J来使列表重新可见。

图1-42 “编辑”工具栏

“编辑”工具栏中与显示相关的5个按钮如表1-3所示。

表1-3 “编辑”工具栏中与显示相关的按钮

(4)“自动显示快速信息”复选框。

选择该复选框,VBE显示键入的函数及其参数,如图1-43所示。可以单击“编辑”工具栏中的参数信息按钮 ,或按快捷键Ctrl+Shift+I来显示该信息。

图1-43 自动显示快速信息

(5)“自动显示数据提示”复选框。

选择该复选框,鼠标指针放到一个变量上时将显示其当前值,如图1-44所示。在调试代码时,该复选框尤为有用。

图1-44 自动显示数据提示

(6)“默认为查看所有模块及过程分隔符”复选框。

选择该复选框(默认),“代码”窗口视图显示模式如图1-45(左)所示;否则如图1-45 (右)所示。也可以通过单击“代码”窗口左下角的“过程查看”按钮 和“全模块查看”按钮 来切换。

图1-45 全模块查看和过程查看模式

(7)拖放文本编辑:选择后,在编辑程序代码时候,可以将代码文本拖放到其他位置,不仅可以在“代码”窗口中随意拖动,从“代码”窗口拖放文本到“立即”窗口或“监视”窗口,用户可以按住Ctrl时用鼠标拖动文本,这样可以复制所选择的文本。

(8)默认为查看所有模块:设置新模块的默认代码视图方式,在“代码”窗口中查看过程是同时显示模块中所有代码或是一次只显示一个过程,它不会改变当前已打开模块的视图方式。

(9)过程分隔符:可以显示或隐藏“代码”窗口中,出现在每个过程尾端的分隔符条。

在模块声明和第1个test过程,test过程与EntryPoint之间的横线为过程分隔符,默认选择“过程分隔符”复选框。

(10)“自动缩进”复选框。

选择该复选框,在VBE中编写一行新代码都将自动缩进与前一行代码保持在同样的定位点上。使用缩进是非常好的编程习惯,所以应选择该复选框。

提示

注意使用Tab键,而不是空格键来缩进,相应地可以使用Shift+Tab快捷键取消缩进。如果要对代码块而不只是一行代码使用缩进,则可以选择代码块,然后按Tab键缩进。“编辑”工具栏中包括缩进 和凸出 按钮。

1.4.2 “编辑器格式”选项卡

“编辑器格式”选项卡如图1-46所示,在其中可以设置选定文本、断点文本及注释文本等不同编辑状态下的前景色和背景色,以方便区分。设定之后最好不要经常变动,这样能够在调试及编辑代码时快速做出判断。

图1-46 “编辑器格式”选项卡

其中的选项如下。

(1)“代码颜色”下拉列表框。

在其中选择VBA代码中不同元素显示的文本颜色和背景色,该下拉列表框中的选项如下。

● 文本列表:列出有自定义颜色的文本项目。

● 前景色:指定所选文本的前景色。

● 背景色:指定所选文本的背景色。

● 标识色:指定页边距指示区的颜色。

(2)“字体”下拉列表框。

在其中选择VBA模块中使用的字体,最好选择一个具有固定宽度的字体。例如Courier New(西方),这样能够使得字符在垂直方向上对得更加整齐,可以很容易地辨别空行。

(3)“大小”下拉列表框。

在其中选择代码使用的字体。

(4)“边界标识条”复选框。

该复选框该使边界标识条可见或不可见,边界标识条中包含边界标识器,即在“代码”窗口的边界标识条中显示的图标。表1-4所示为边界标识器及其意义。

表1-4 边界标识器及其意义

可以在编辑代码期间,页边距指示区中的“边界标识条”可提供一些视觉上的帮助,在编辑代码期间为特定操作提供可视线索。

完成所有选项的设置后,可以通过“示例”来预览效果,其中显示字体、大小及颜色设置的示例文本。

1.4.3 “通用”选项卡

在图1-47所示“通用”的选项卡中常用的是“错误捕获”选项组,在程序中使用错误处理语句之后,就需要选择“在类模块中中断”或“遇到未处理的错误时中断”复选框如果选择“发生错误则中断”复选框,则无法使用On Error等错误处理语句。

图1-47 “通用”选项卡

1.4.4 “可连接的”选项卡

图1-48所示为“可连接的”选项卡,如果选择有关复选框,更易于辨别和定位某个窗口;如果清除了所有窗口前的复选框,VBE 中的窗口变得杂乱无章。通常来说,不需要改变该选项卡中的默认设置。

图1-48 “可连接的”选项卡

1.4.5 定制工具栏和菜单栏

右击工具栏,单击快捷菜单中的“自定义”命令,弹出如图1-49所示的“自定义”对话框。

图1-49 “自定义”对话框

单击“新建”按钮,弹出“新建工具栏”对话框。

键入新工具栏的名称,然后单击“确认”按钮。

切换到“命令”选项卡,将所需要的工具拖动到新建的工具栏中。

单击“确认”按钮。

如图1-50所示,将“命令”选项卡中“格式”类别中的“居右”按钮拖动到“格式”下拉菜单中。同时也可以移除菜单栏中菜单项中的命令。

图1-50 在“格式”下拉菜单中添加“居右”按钮

1.5 使用系统帮助

在VBA中获取帮助的方式有如下多种。

(1)使用对象浏览器:获取对象所拥有的属性及方法等的信息。

(2)使用”立即”窗口:测试不是很有把握的代码。

(3)使用宏录制器:获取与所需操作相关的VBA关键词。

(4)使用F1键:查询给定函数及对象的用法等信息。

编写宏代码过程中需要了解对某个函数或对象等用法时,将鼠标指针放到该函数或对象中,然后按F1键弹出与该函数或对象相关的帮助信息窗口。

如图1-51(左)所示,将鼠标指针放到ActiveCell对象中,按F1键弹出图1-51(右)所示的“Excel Help”窗口。其中给出了与ActiveCell相关的Application.ActiveCell属性和Window.ActiveCell属性,可以根据需要选择其中的某一个或两个以查看详细帮助信息。

图1-51 需要查询帮助信息的代码及相应的帮助信息

也可以单击“帮助”|“Microsoft Visual Basic帮助”命令打开“Excel Help”窗口,在“搜索”文本框中输入需要搜索的关键词,然后按回车键或单击搜索按钮

1.6 认识信任中心

信任中心是 Office2007 中与文档安全性相关的设置新用户的界面,其中的一些设置会影响到所有Office应用程序。

打开如图1-52所示的“信任中心”对话框的步骤如下。

图1-52 “信任中心”对话框

单击“Microsoft Office”按钮|“Excel选项”命令,打开“Excel选项”对话框。

选中列表左端的“信任中心”选项。

单击右端的“信任中心设置”按钮。

其中将所有Excel 2007文档安全性选项分为如下8类。

(1)受信任的发布者。

其中列出用户选择信任的数字证书,一个数字证书是一个可以用来“签名”一个Excel加载项或其他类型应用程序的软件签名。它确保应用程序实际来源于其声明处,并在其签名之后没有被篡改,也称为“数字签名”。

数字证书必须从一个VeriSign(www.verisign.com)之类的权威证书机构获取,相对来说较贵。每年需花费500多美元来维持该签名,因此Excel VBA开发人员很少使用数字证书。

(2)受信任位置。

一个“受信任位置”是计算机或网络上的一个文件夹,其中仅包括安全的文档。放置在受信任位置的Excel工作簿、加载项,以及其他Office文档不会受到任何安全性限制,受信任位置分类如图1-53所示。

“受信任位置”下拉列表框中显示两种受信任位置,其他用户位置是通过用户添加或默认下成为受信任位置。所有Office 2007的模板、startup(启动)文件夹以及Office库文件夹都是受信任位置,其他信任文件夹可以通过用户添加;策略位置被网络管理者定义为对所有用户是受信任位置。

单击“添加新位置”按钮打开图1-54所示的对话框。

其中“浏览”按钮用来选择需要受信任的文件夹,可以通过选择“同时信任此位置的所有字文件夹”复选框来选择信任被选择文件夹下的所有子文件夹。也可以为受信任位置添加一个描述,当在信任位置列表中选择该位置时显示有关描述。

不能信任根文件夹,例如C:\,默认不能设置一个网络文件夹为受信任位置。如果想要信任一个网络文件夹,必须要选择图1-53中所示的“允许网络上的受信任位置(不推荐)”复选框。

图1-53 “受信任的位置”类别

选择一个位置,单击“删除”按钮其移除该受信任位置;单击“修改”按钮将显示如图1-54所示的对话框,允许用户定制所选的位置。如果在信任位置列表中没有选中任何项目,则该两个按钮都不可使用。

图1-54 添加受信任的位置

要禁止整个从信任位置特性,选择“禁用所有受信任位置,仅信任由受信任的发布者签署的文件”复选框,这样任何类型的文件夹都不会隐式被信任,只有从受信任的发布者签署的文件才会通过安全设置。

(3)加载项。

如图1-55所示,加载项类别包括控制Excel 2007是否信任包括在Excel加载项中的代码,这只是控制加载项的一些设置。如果在该类别中没有选择任何选项,在其他类别中的重叠设置也可以截获一个Excel 2007加载项的运行。在加载项类别中一个不正确的设置可能会阻止任何加载项正常发挥作用。

图1-55 “加载项”类别

其中的3个复选框如下。

● 要求受信任的发布者签署应用程序加载项:选择后,仅有受信任的发布者签署的加载项被允许运行。它可能与一个加载项位于一个受信任的文件夹的事实相冲突。如果试图加载一个未被一个受信任的发布者签署的加载项,该加载项将被加载,但是会收到一条提示加载项被禁用的通知

● 禁用未签署加载项通知(代码将保持禁用状态):选择后,未被受信任的发布者签署的加载项将直接被禁用,而没有任何提示。

● 禁用所有应用程序加载项(可能会影响功能):选择后所有Excel加载项都将被禁用而没有任何的提示,使其他所有的信任中心设置安全都无效。包括受信任的发布者、受信任位置及宏设置(将在后面介绍),并且上两个复选框将被禁用。

注意可以修改该类中的任何设置,但是必须关闭并重启Excel以使改变生效。

(4)ActiveX设置。

该类别包括控制Excel如何处理在文档中嵌入的ActiveX控件的选项,常见的嵌入Excel工作表的 ActiveX 控件是从功能区上“开发工具”选项卡|“控件”组中的 ActiveX 控件,如图1-56所示。

图1-56 ActiveX控件

ActiveX 设置仅适用于工作表中的嵌入式 ActiveX,而对用户窗体或 VBA 工程中的ActiveX控件没有影响。“ActiveX设置”类别中的选项如图1-57所示。

图1-57 “ActiveX设置”类别中的选项

在本类别中的设置将应用于整个 Office 应用程序,并且也被受信任位置设置所覆盖。即如果工作簿位于一个受信任文件夹中,则在ActiveX类别中的设置对其无效。例外是一个拥有在注册表中kill bit set的ActiveX控件,并发生在某个特别的ActiveX控件是带毒时,有一个kill bit set的ActiveX控件在任何情况下都不会运行的。

ActiveX设置可以有一些困惑,因为其作用可以根据一个文档包括的控件的具体类型而改变。如下为两类ActiveX控件。

● SFI:Safe for initialization,初始化不安全。

● UFI:Unsafe for initialization,初始化安全。

“开发工具”选项卡的“控件”组中的所有 ActiveX 控件都是 SFI;反之,其他控件是UFI。例如,VBE中控件工具箱中的Frame和MultiPage都是UFI控件。通常来说,UFI控件比SFI更易受到更多的安全限制。

“ActiveX设置”类别中的单选按钮如下,描述假定包括ActiveX控件的Excel工作簿不在一个信任文件夹下。

● 禁用所有控件,并且不通知:所有工作簿中的所有 ActiveX 控件都将变成不可用,并且不会得到控件不可用的通知。

● 以附件限制启用“初始化不安全”(UFI)控件,以及减少限制启用“初始化安全”(SFI)控件签提示我:如果工作簿中的所有 ActiveX 控件都是 SFI 控件,则所有控件都会被正常的加载;如果至少一个有UFI控件,则所有控件均无效的,并显示一个消息栏通知。如果使用消息栏来使内容可用,SFI 控件被正常装载。但是 UFI 控件将被被装载没有任何持续的值,这意味着通过选择这个选项启用 ActiveX 控件将导致用户损失一些对工作簿中任何UFI控件所做的所有定制。

● 以最小限制启动所有控件之前提示我:默认选项,如果工作簿中所有 ActiveX 控件都是SFI控件,那么所有的控件都可以正常被加载;如果至少有一个UFI控件,则所有的 ActiveX 控件都不可用,并且会显示一个消息栏通知。如果使用消息栏来启用内容,所有的控件都会被正常加载。

● 无限制启用所有控件并且不进行提示(不推荐,可能会运行有潜在危险的控件):在所有工作簿中的所有ActiveX控件都允许运行,并且不出现其存在的通知。

● 安全模式(帮助限制控件对计算机的访问):只适用于SFI控件,一些SFI控件在以不安全模式加载时,比以安全模式加载具有更多的扩展(也许更危险)功能,选择该单选按钮导致Excel一直都以安全模式加载SFI控件。UFI控件从定义上看,一直都处于不安全模式,因此必须使用描述其如何被管理的选项。

(5)宏设置。

“宏设置”类别包括控制Excel如何响应包括宏的工作簿和加载项,这些设置没有应用于来自于一个受信任位置的工作簿或加载项。与ActiveX设置不同,宏设置的改变仅仅影响Excel。“宏设置”类别中的选项如图1-58所示。

图1-58 “宏设置”类别选项

其中的单选按钮如下,注意这些设置的任何改变将不只影响当前打开的工作簿。将需要关闭并重新打开任何目前已经打开的工作簿,以及新设置发挥作用。

● 禁用所有宏,并且不通知:选择后在所有工作簿和加载项中的所有宏都将被禁用,并且没有消息栏通知。注意仍然可以查看和编辑使用该设置打开工作簿中的代码,但是不能运行这些宏。

● 禁用所有宏,并发出通知:选择后每次打开一个包括宏的工作簿或加载项时都会出现图1-59所示的安全警告。在其中可以基于打开的每个文件选择启用或禁用宏,这是宏设置类别的默认选项。

图1-59 安全警告

● 禁用无数字签署的所有宏:选择后执行禁用包含VBA代码,但是没有数字签署的工作簿中的所有宏并不发出通知。如果一个工作簿包括被一个受信任的发布者数字签署的VBA代码,则其以启用宏的方式打开;如果一个包含VBA代码的工作簿被一个尚未被信任的签署者进行了数字签署,将会提示如图1-59所示的一个安全警告对话框,允许在启用和禁用宏之间进行选择。

● 启用所有宏(不推荐,可能会运行具有潜在危险性的代码):选择后所有工作簿和加载项中的所有宏都将被启用,打开一个包括VBA代码的工作簿或加载项时也不会出现任何通知。

● 信任对VBA工程对象模型的访问:一些VBA代码需要操作一个工作簿或加载项的VBA工程,这些程序常常都是作为VBA开发人员的工具,必须选择该单选按钮以使得这个工具可以发挥作用。默认为不选,VBA代码不允许访问任何工作簿或加载项中的VBA工程。

(6)消息栏。

“消息栏”通知用户宏在未签署的加载项中被禁用,它一直可见。但是不会干涉对Excel的使用,直到单击“选项”按钮来选择启用或禁用宏。

该类别包括控制消息栏显示,以及记录信任中心活动的相关选项,如图1-60所示。

图1-60 “消息栏”类别

注意消息栏类别的设置后有的Office应用程序,其他选项如下。

● 文档内容被阻止时在所有应用程序显示消息栏:默认。当文档内容被阻止时,该单选会引导信任中心显示一个与其安全设置相关的消息栏通知。

● 从不显示有关阻止内容的消息:选择关闭消息栏,信任中心将继续阻止由安全设置指定的任何操作,但是不会向用户发出通知。如果应用程序中的某个功能没有发生作用,并且没有任何的消息栏提示,那么应检查该单选按钮是否被选择。

● 启用信任中心日志记录:如果需要信任中心在一个日志文件中记录下所有与安全相关的活动,那么选择该复选框。日志文件将被命名为“XLTCD.LOG”,位于C:\Documents and Settings\<用户名>\Local Settings\Application Data\Microsoft\ Office\TCDiag下。

(7)外部内容。

“外部内容”类别控制Excel是如何更新在工作簿外部的内容,其中包括两种通过外部内容类别设置控制外部内容的类别。一是来自于数据库和其他非 Excel 源的内容,通常通过PivotTables、ListObjects及QueryTables;二是外部Excel工作簿,这是从工作表公式最常用的连接。两类内容是在外部内容类别下通过分离的选项组控制,如图1-61所示。

图1-61 “外部内容”类别

其中“数据连接的安全设置”选项组中的单选按钮如下。

● 启用所有数据连接(不建议使用):选择后在打开一个包括对外部数据连接的工作簿时不能接收任何的警告,包括自动数据更新在内的所有的外部数据连接功能特性都将被启用。

● 提示用户数据连接的相关信息:选择后在打开一个包括对外部数据有连接的工作簿时,会收到一个消息栏通知。所有的外部数据连接功能特性都将被禁用,直到用户单击消息栏中的“选项”按钮,并选择启用连接,这是默认选项。

● 禁用所有数据连接:选择后所有的外部数据连接功能特性都将自动禁用,并且没有消息栏通知。

● “工作簿连接的安全设置”选取项组中的单选按钮如下。

● 启用所有工作簿链接的自动更新(不建议使用):选择后所有连接到外部Excel工作簿就将自动更新,并且无法接收到任何消息栏通知。

● 提示用户工作簿链接的自动更新:选择后打开一个包括对外部工作簿链接的工作簿时,将收到一个消息栏通知。链接不会被更新;除非单击消息栏中的“选项”按钮,并选择启用链接。

● 禁用工作簿链接的自动更新:选择后所有对外部 Excel 工作簿都将被禁用,而不提供任何消息栏通知。

(8)个人信息选项。

“个人信息选项类别”包括多个与个人信息或安全性有关的选项,如图1-62所示。

图1-62 “个人信息选项”类别

这些选项对VBA程序无用,因此在此不做详细介绍。

文档检查器是 Office 的一个新特性,允许遍历文档中个人信息项目可能被存储的所有位置并移除这些项目。在“信任中心”对话框中单击“文档检查器”按钮,显示如图1-63所示的“文档检查器”对话框。

图1-63 “文档检查器”对话框

可以选择想要检查的工作簿的区域,并单击“检查”按钮来开始过程。文件检查器将分析工作簿,并生成一个结果的报告。

如果文档检查器在引导其进行分析的任何位置定位数据,将给予用户移除数据的选项。使用文档检查器时,记住其不是很智能,它不能区分文档的关键数据和不需要的个人信息。如果单击“移除所有”按钮,文档检查器简单地从一个指定的位置移除所有的数据。

从一个Excel开发员的角度,文档检查器是一个非常危险的工具。如果用户可以不受约束地访问应用程序工作簿,并且工作簿中包括位于隐藏行、列或工作表中的关键信息,文档检查器就可以简单地清除该数据。

如果一个工作簿中有受保护工作表,就会阻止文档检查器在该工作簿上运行。因此要在文档检查器中保护工作簿,确保至少包括了一个受保护的工作表。该工作表不需要包括任何关键数据,而且甚至可以从用户处隐藏。

1.7 小结

本章讲述了如何录制宏如何及查看VBA代码,并介绍了VBA集成开发环境。

录制的结果不可能非常灵活,宏仅能用来对某个特定的单元格区域执行一个特定的任务。此外,录制宏很可能比VBA代码运行效率低。要建立能够适应于改变,运行很快并能够利用Excel的更多高级功能特性的交互式宏,如自定义对话框,则需要学习VBA.

宏录制器是VBA开发人员最有用的工具之一,这是生成工作VBA代码的快速方式,但是必须准备好使用自己的VBA知识来编辑录制宏以获得灵活和高效的代码。