Excel VBA编程实战宝典
上QQ阅读APP看书,第一时间看更新

第4章 使用Application对象处理Excel程序

Application对象代表整个Excel程序,它位于Excel对象模型的顶层,其中包含其他所有的Excel对象,通过Application对象可以引用其他任何Excel对象。Application对象包含用于完成Excel应用程序范围的选项设置和操作的属性和方法。本章将详细介绍Application对象常用的属性、方法的功能以及它们在实际中的应用。Application对象的一些方法(如Intersect和Union)用于处理单元格区域,这部分内容将会在第7章介绍数据区域的处理时进行统一讲解。Application对象的一些属性(如Dialogs和FileDialog)用于处理对话框,这部分内容将在第13章介绍Excel对话框时进行统一讲解。

4.1 理解Application对象和全局属性

Application对象的很多属性和方法都是全局成员。按F2键打开对象浏览器,在“工程/库”下拉列表中选择Excel,然后在“类”列表中选择“全局”,可以在右侧看到Excel对象模型中的所有全局成员,如图4-1所示。

图4-1 在对象浏览器中查看Excel中的全局成员

全局成员的一个优势是在代码中使用它们时,可以不必在全局的属性和方法之前使用对象限定符Application。下面的两行代码具有相同的功能,由于ActiveSheet是全局成员,因此可以省略其左侧的Application对象的限定。

    Application.ActiveSheet
    ActiveSheet

全局成员中以Active开头的属性用于表示当前活动的对象,无论这些对象的名称是什么,都自动引用当前活动的对象,这样就可以利用这些属性来编写适应性强的通用代码。表4-1列出了以Active开头的全局属性的名称、返回对象的类型以及说明。

表4-1 以Active开头的全局属性

无论当前打开了多少个工作簿,下面的代码始终显示当前处于活动状态的工作簿的名称:

    MsgBox ActiveWorkbook.Name

下面的代码将文字“商品”输入到当前活动的单元格中。如果当前活动的单元格是A1,则会将文字输入到A1中;如果当前活动的单元格变成B6,则会将文字输入到B6中。

    ActiveCell.Value = "商品"

Application对象还有一个Selection属性,它表示在当前活动的工作簿窗口中所选择的对象。选中的对象可以是单元格或单元格区域,也可以是图片、图形、图表等不同类型的内容。下面的代码在当前选中的单元格或单元格区域中输入文字“姓名”:

    Selection.Value = "姓名"

如果当前选择的对象不是单元格或单元格区域,而是其他对象,比如图片或图表,运行上面的代码将会出现运行时错误,因为这些对象不支持Value属性。解决这类问题的方法是在设置对象的属性之前,先使用TypeName函数检查所选对象的类型,之后再对特定对象执行适当的操作。

案例4-1 在选区中输入内容

下面的代码使用If Then判断结构检查Selection对象的类型,如果是Range,则在选区中输入内容,否则显示提示信息以告知用户当前选择的不是单元格或单元格区域。

注意:由于VBA默认使用二进制方式来比较文本,因此与TypeName函数的返回值进行比较的表示对象类型的字符串必须严格遵守大小写格式,即以大写字母开头,其他字母小写。

与预想的不同,在输入Selection和一个英文句点后并不会自动弹出包含属性和方法的成员列表,这对于编写代码而言很不方便。解决这个问题的一种方法是,先声明一个Range类型的对象变量,然后将Selection赋值给这个变量,就能获得自动弹出的成员列表,如图4-2所示。

    Sub 在选区中输入内容()
        Dim rngSelection As Range
        Set rngSelection = Selection
        rngSelection.Value = "姓名"
    End Sub

图4-2 为Selection显示自动成员列表

4.2 获取Excel程序的相关信息

本节将介绍通过Application对象的一些属性来获取Excel程序的相关信息的方法,这些信息包括Excel版本号、用户名、安装路径、启动文件夹路径以及工作簿模板路径。

4.2.1 获取Excel程序的版本号

可以通过Application对象的Version属性获取Excel程序的版本号。下面的代码返回Excel程序的版本号。

    Application.Version

可以在判断结构中检测Excel程序的版本号,然后给出不同的提示信息或适当的操作。

案例4-2 根据Excel版本显示不同信息

下面的代码根据检测到的Excel版本号而显示不同的信息。Val函数是VBA的一个内置函数,使用该函数将由Version属性返回的字符串类型的版本号转换为数值,然后以此作为Select Case检测的值,根据不同的版本号显示不同的信息。

提示:Val函数返回字符串中从第一个字符开始的连续数字。如果字符串由数字和非数字组成,那么Val函数只会返回从第一个数字开始,直到遇到第一个不是数字的字符之前包含的这些数字。例如,Val("1.68ABC168")的返回值是1.68。如果字符串的第一个字符不是数字,Val函数会返回0。

4.2.2 获取在Excel程序中设置的用户名

使用Application对象的UserName属性可以获取在“Excel选项”对话框中设置的用户名,如图4-3所示。下面的代码返回Excel程序的用户名:

    Application.UserName

图4-3 在“Excel选项”对话框中设置的用户名

4.2.3 获取Excel安装路径、启动文件夹路径和工作簿模板路径

1.获取Excel程序的安装路径

我们有时可能需要知道Excel程序的安装位置,从而在程序中执行一些特殊操作。使用Application对象的Path属性可以获取Excel程序的安装路径,如下所示:

    Application.Path
2.获取Excel启动文件夹的路径

如果希望让某些工作簿随Excel自动启动,以便在Excel程序运行期间,该工作簿中的功能可以被其他打开的工作簿使用。使用Application对象的StartupPath属性可以获取Excel启动文件夹的路径,如下所示:

    Application.StartupPath
3.获取Excel工作簿模板的路径

如果需要处理Excel的工作簿模板,那么需要知道工作簿模板的路径。使用Application对象的TemplatesPath属性可以获取Excel工作簿模板的路径,如下所示:

    Application.TemplatesPath

4.3 设置Excel程序的界面环境与操作方式

Application对象的一个主要用途是设置Excel程序的界面环境和通用选项,通常用于对Excel操作环境的初始化设置。本节将介绍一些用于控制Excel程序界面环境与操作方式的Application对象的属性。

4.3.1 设置Excel程序的可见性

正常情况下,启动的Excel程序是可见的。出于某些特殊目的,有时希望以隐藏状态启动Excel程序并在幕后执行一些操作,此时可以使用Application对象的Visible属性。该属性返回或设置一个Boolean类型的值,如果为True则表示Excel程序可见,如果为False则表示Excel程序不可见,即隐藏。下面的代码将Excel程序设置为隐藏状态。

    Application.Visible = False

4.3.2 设置Excel程序窗口是否全屏显示

Excel程序窗口的全屏显示与窗口最大化不同,全屏显示会将Excel窗口中的标题栏、功能区、状态栏和编辑栏全都隐藏起来,为用户提供最大尺寸的编辑区域。如果希望Excel程序窗口全屏显示,而不是普通窗口大小,那么可以设置Application对象的DisplayFullScreen属性。该属性返回或设置一个Boolean类型的值,如果为True则表示Excel程序窗口处于全屏显示,如果为False则表示Excel程序窗口未全屏显示。

案例4-3 设置Excel窗口全屏显示

下面的代码检查Excel程序窗口是否全屏显示,如果没有则将其全屏显示。

如果希望可以自动在全屏与非全屏之间切换显示,即如果当前未全屏显示,则将Excel程序窗口设置为全屏显示;如果当前已经全屏显示,则将Excel程序窗口设置为非全屏显示,那么可以使用下面的代码:

    Sub 在全屏与非全屏之间切换()
        Application.DisplayFullScreen = Not Application.DisplayFullScreen
    End Sub

由于Application.DisplayFullScreen返回的是一个True或False,因此对该返回值使用Not运算符取反则得到一个与返回值相反的False或True。例如,如果等号左边的Application.DisplayFullScreen的返回值是True,则表示当前处于全屏显示状态,那么在等号右边使用Not运算符取反后得到的是False,然后将该结果赋值给等号左边的DisplayFullScreen,就可以将全屏显示改为非全屏显示。

4.3.3 设置Excel程序窗口的状态

窗口的状态是指最大化、最小化、正常等窗口显示方式。使用Application对象的WindowState属性可以返回或设置窗口的状态,返回或设置的值由XlWindowState常量提供,见表4-2。

表4-2 XlWindowState常量

下面的代码将当前活动的Excel程序窗口设置为最大化:

    Application.WindowState = xlMaximized

可以使用循环结构为当前打开的所有工作簿窗口设置一种指定的窗口状态。

案例4-4 将所有Excel窗口最大化

下面的代码使用For Each循环结构将打开的每一个工作簿窗口都设置为最大化。

下面的代码使用For Next循环结构完成了相同的功能:

4.3.4 设置Excel程序窗口的尺寸和位置

Application对象的Height和Width属性用于设置Excel程序窗口的高度和宽度,默认以磅为单位。由于厘米通常是屏幕尺寸中的常用单位,因为可以使用Application对象的CentimetersToPoints方法将厘米转换为磅。

在设置Height和Width属性时需要注意,如果窗口的状态为最大化,那么无法设置这两个属性;如果窗口的状态为最小化,那么Height属性表示的是该Excel窗口的任务栏按钮的图标高度。换句话说,只有在窗口的状态为正常时,才能设置Height和Width属性。因此,在设置Height和Width属性之前,需要检查Excel程序窗口的当前状态。

案例4-5 设置Excel窗口的尺寸

下面的代码将当前活动的Excel窗口的宽度设置为25厘米,高度设置为18厘米。首先检查WindowState属性的值是否为xlNormal,如果是则说明窗口处于正常状态,此时可以设置窗口的尺寸。然后使用Application对象的CentimetersToPoints方法将输入的以厘米为单位的宽度和高度值转换为磅,以实现按照厘米来设置窗口的尺寸。代码中使用With结构简化对Application对象的引用。

如果希望控制Excel程序窗口在屏幕中的位置,则可以使用Application对象的Left和Top属性。Left属性用于设置从屏幕左边缘到Excel程序窗口左边缘的距离,Top属性用于设置从屏幕上边缘到Excel程序窗口上边缘的距离。这两个设置都以磅为单位,如果希望使用厘米为单位来进行设置,则需要使用上一个案例用到的Application对象的CentimetersToPoints方法进行转换。

案例4-6 设置Excel窗口在屏幕中的位置

下面的代码将当前活动的Excel程序窗口的位置设置为距离屏幕左边缘5厘米,同时距离屏幕上边缘2厘米。

4.3.5 设置Excel程序窗口标题栏中显示的名称

在Excel程序窗口的标题栏中同时显示了当前打开的工作簿的名称以及Excel程序的名称。Application对象的Caption属性用于返回或设置Excel程序窗口标题栏中的Excel程序名,默认显示为“Excel”。下面的代码将Excel程序窗口标题栏中的程序名改为“人事管理系统”,效果如图4-4所示。

    Application.Caption = "人事管理系统"

图4-4 设置Excel程序窗口标题栏中显示的程序名称

如果希望不显示Excel程序的名称,可以将只包含空格的字符串赋值给Caption属性,如下所示:

    Application.Caption = " "

如果希望恢复为默认名称,可以将空字符串赋值给Caption属性,如下所示:

    Application.Caption = ""

4.3.6 设置编辑栏、浮动工具栏和“开发工具”选项卡的显示状态

1.设置编辑栏

编辑栏是Excel中输入公式的地方,默认情况下显示编辑栏。使用Application对象的DisplayFormulaBar属性可以设置编辑栏的显示状态,该属性返回或设置一个Boolean类型的值,如果为True则表示显示编辑栏,如果为False则表示隐藏编辑栏。下面的代码将编辑栏隐藏起来,效果如图4-5所示。

    Application.DisplayFormulaBar = False
2.设置浮动工具栏

用于设置浮动工具栏显示状态的属性有两个,一个是Application对象的ShowSelectionFloaties属性,该属性与“Excel选项”对话框“常规”选项卡中的“选择时显示浮动工具栏”选项的作用相同。ShowSelectionFloaties属性返回或设置一个Boolean类型的值,如果为True则不显示浮动工具栏,如果为False则显示浮动工具栏。下面的代码在单元格中选择内容时禁止显示浮动工具栏:

    Application.ShowSelectionFloaties = True

图4-5 隐藏编辑栏

虽然ShowSelectionFloaties属性可以禁止单元格处理编辑状态下,选择单元格中的内容时不会显示浮动工具栏,但是无法禁止右击单元格时显示的浮动工具栏。

如果希望在右击单元格时不显示浮动工具栏,则可以使用Application对象的ShowMenuFloaties属性,该属性返回或设置一个Boolean类型的值,如果为True则不显示浮动工具栏,如果为False则显示浮动工具栏。下面的代码禁止在右击单元格时显示浮动工具栏:

    Application.ShowMenuFloaties = True

如果要彻底禁用浮动工具栏,则可以将ShowSelectionFloaties和ShowMenuFloaties属性都设置为True。

3.设置“开发工具”选项卡

使用Application对象的ShowDevTools属性可以设置“开发工具”选项卡的显示状态,该属性与在“Excel选项”对话框“自定义功能区”选项卡右侧的列表框中是否选中“开发工具”复选框的作用相同,如图4-6所示。

图4-6 在“Excel选项”对话框中设置“开发工具”选项卡的显示状态

ShowDevTools属性返回或设置一个Boolean类型的值,如果为True则在功能区中显示“开发工具”选项卡,如果为False则在功能区中不显示“开发工具”选项卡。下面的代码将“开发工具”选项卡显示在功能区中。

    Application.ShowDevTools = True

4.3.7 设置状态栏中显示的信息

默认情况下,Excel程序窗口底部的状态栏中显示了单元格当前的编辑模式。我们可能希望在运行一个耗时较长的程序时能够显示一些对用户有用的信息,比如程序运行的当前进度。使用Application对象的StatusBar属性可以返回或设置状态栏中显示的信息。

案例4-7 自定义状态栏中显示的信息

下面的代码可以测试For Each循环结构中的对象变量对集合中每一个对象的引用情况。首先使用InputBox函数显示一个对话框,要求用户输入一个表示单元格区域的地址。然后将这个地址转换为Range对象并赋值给rngCells对象变量。为了避免由于用户输入无效地址而不能正确转换为可被Excel识别的单元格区域,因此加入了防错程序。最后在For Each循环结构中使用rngCell对象变量在指定的单元格区域中依次遍历每一个单元格,并在状态栏中显示当前处理的单元格的地址。程序的运行效果如图4-7所示。

图4-7 设置状态栏中显示的信息

注意:如果希望在程序运行结束后将状态栏的控制权交还给Excel,以使状态栏恢复默认的操作,则需要将StatusBar属性设置为False,正如在上面案例中看到的,否则最后的信息会一直停留在状态栏中。

4.3.8 设置警告信息的显示方式

当删除一个工作表时会自动弹出如图4-8所示的对话框,单击“删除”按钮,将会删除该工作表。在Excel中执行的很多操作都会收到类似的警告信息,比如关闭未保存的工作簿、覆盖已存在的工作簿、合并非空单元格等。

图4-8 执行某些操作时显示的警告信息

当在VBA代码中包含会弹出警告信息对话框的操作时,程序将被迫中断并等待用户做出选择。但是即使用户做出的选择与VBA代码执行的操作相反,Excel也会认为已经执行了代码所要执行的操作。仍然以上面提到的删除工作表为例,如果用户在警告信息对话框中没有单击“删除”按钮而是单击了“取消”按钮,那么Excel仍然会认为已经执行了删除工作表的操作,从而导致意外的结果。另一方面,在VBA代码运行期间总是频繁弹出需要用户确认的警告信息,很大程度上会影响程序执行的效率和流畅度。

Application对象的DisplayAlerts属性用于设置警告信息的显示方式。该属性返回或设置一个Boolean类型的值,如果为True则正常显示操作过程中产生的警告信息,如果为False则不显示警告信息,并自动执行与警告信息对话框中默认的按钮相关联的操作,比如在删除工作表时显示的警告信息对话框中的默认操作是单击“删除”按钮。

案例4-8 控制警告信息的显示方式

下面的代码在执行删除当前活动的工作表操作之前,屏蔽了警告信息对话框,在删除工作表操作之后,重新恢复显示Excel默认的警告信息对话框。

    Sub 控制警告信息的显示方式()
        Application.DisplayAlerts = False
        ActiveSheet.Delete
        Application.DisplayAlerts = True
    End Sub

在执行完可能会显示提示信息对话框的操作后,应该将DisplayAlerts属性设置为True,以恢复Excel默认的提示信息功能,从而避免在没有任何提示的情况下执行意想不到的操作。当VBA过程运行结束后,Excel会自动将DisplayAlerts属性设置为True。

4.3.9 设置新工作簿中默认包含的工作表数量

在Excel 2016中新建的工作簿默认只包含一个工作表,而在Excel 2010中新建的工作簿默认包含3个工作表。使用Application对象的SheetsInNewWorkbook属性可以设置新建的工作簿中默认包含的工作表数量,该属性与在“Excel选项”对话框“常规”选项卡中的“包含的工作表数”选项的作用相同,如图4-9所示。

图4-9 设置新建的工作簿中默认包含的工作表数量

下面的代码将默认工作表的数量设置为6,以后每次新建工作簿时,其中都会自动包含6个工作表。

    Application.SheetsInNewWorkbook = 6

4.3.10 设置工作簿的默认字体和字号

使用Application对象的StandardFont和StandardFontSize属性可以设置新建的工作簿中默认使用的字体和字号。StandardFont属性用于设置默认字体,StandardFontSize属性用于设置默认字号。这两个属性与在“Excel选项”对话框“常规”选项卡中的“使用此字体作为默认字体”和“字号”选项的作用相同。下面的代码分别将新建的工作簿中的默认字体设置为“黑体”,默认字号设置为“16”:

    Application.StandardFont = "黑体"
    Application.StandardFontSize = 16

提示:要使新设置的默认字体和字号生效,必须退出Excel程序并重新启动。

4.3.11 设置打开文件时的默认路径

默认情况下,当在Excel中显示“打开”对话框以打开某个文件时,对话框中默认定位到的位置是当前登录系统的用户的“我的文档”文件夹,这是Excel中打开文件的默认位置。如果经常使用的文件位于某个特定位置,则可以将该位置设置为Excel中默认的文件打开位置,以加快打开文件的速度。

使用Application对象的DefaultFilePath属性可以设置打开文件的默认位置,该属性与在“Excel选项”对话框“保存”选项卡中的“默认本地文件位置”选项的作用相同,如图4-10所示。

下面的代码将打开文件的默认位置设置为E盘根目录下名为“重要文件”的文件夹:

    Application.DefaultFilePath = "E:\重要文件"

如果为DefaultFilePath属性指定的文件夹不存在,则将不会改变最近一次成功设置的打开文件的默认位置,而且也不会显示设置失败的提示信息。因此,为了避免设置了无效的位置,可以加入防错代码。

图4-10 设置打开文件的默认位置

案例4-9 设置打开文件的默认位置

下面的代码使用一个String数据类型的变量存储用户在对话框中输入的表示默认位置的路径。然后在If Then结构中使用VBA内置的Dir函数检查输入的路径是否存在,如果该函数返回空字符串,则表示路径不存在,否则表示路径存在。如果路径不存在,则会显示提示信息并结束程序,如果路径存在则将其设置为打开文件的默认位置。

4.3.12 控制屏幕刷新

在运行一段耗时较长的程序时,可能不想看到频繁闪烁的屏幕。使用Application对象的ScreenUpdating属性可以控制屏幕刷新的方式。该属性返回或设置一个Boolean类型的值,如果为True则开启屏幕刷新,如果为False则关闭屏幕刷新。

下面的代码关闭了屏幕刷新,在程序运行的过程中屏幕显示将不会发生变化,从而可以加快程序的运行速度。

    Application.ScreenUpdating = False

当程序运行结束后,才会在屏幕中显示最终结果。或者可以在代码中的任何位置加入下面的语句,以随时显示屏幕的变化情况。

    Application.ScreenUpdating = True

提示:如果需要在程序运行的过程中显示Excel内置对话框或用户窗体,那么需要开启屏幕刷新,否则在拖动对话框时,将会在屏幕上产生橡皮擦的效果。

4.4 使用Excel程序

本节将介绍使用Application对象的几个方法来完成一些有用的工作,具体包括以下几个方法:OnTim、OnKey、Evaluate、SendKeys。还介绍了如何在VBA中使用工作表函数。

4.4.1 定时自动运行VBA过程

使用Application对象的OnTime方法可以在指定的时间自动运行指定的VBA过程。实现这一功能的前提条件是必须已经启动了Excel程序,让Excel程序运行于内存中。在定时自动执行指定的VBA过程之前,用户在Excel中进行的各种操作都不受影响。OnTime方法包含4个参数,语法格式如下:

    Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

□ EarliestTime:必选,运行VBA过程的时间。

□ Procedure:必选,要运行的VBA过程的名称。

□ LatestTime:可选,开始运行VBA过程的最晚时间。

□ Schedule:可选,一个Boolean类型的值。如果为True则设置一个新的定时运行的VBA过程,如果为False则清除之前设置的某个VBA过程。如果省略该参数,则其值默认为True。

在指定过程运行的时间时,可以使用VBA内置的TimeValue或TimeSerial函数。TimeValue函数包含一个参数,是一个表示时间的字符串。TimeSerial函数包含3个参数,分别表示时间中的时、分、秒。下面两种形式表示的都是下午两点半:

    TimeValue("14:30:00")
    TimeSerial(14, 30, 0)
案例4-10 在指定时间定时执行任务

下面的代码将在当天下午2点30分自动运行名为“会议提醒”的VBA过程,用于向用户发出会议提醒的提示信息,其中使用TimeValue函数来指定时间。编写好代码后,需要运行名为“定时执行任务”的过程,在下午2点30分将会自动显示“今天下午4点有个重要会议!”的提示信息。

下面的代码可以完成相同的任务,但是使用TimeSerial函数来指定时间。

也可以指定在距离现在多长时间之后运行VBA过程,此时可以使用Now函数来表示当前时间,将其与TimeValue或TimeSerial函数相加即可得到间隔多久之后的时间。

案例4-11 隔多长时间后定时执行任务

下面的代码在30分钟后运行名为“会议提醒”的VBA过程,其中使用TimeValue函数来指定时间。

下面的代码可以完成相同的任务,但是使用TimeSerial函数来指定时间。

除了按照预定的时间自动运行VBA过程之外,还能够以固定的时间间隔自动重复运行VBA过程,方法是在要运行的VBA过程内部使用Application对象的OnTime方法,并将Procedure参数指定为该过程本身。

案例4-12 定时重复执行任务

下面的代码每隔30分钟发出一次会议提醒的提示信息,在OnTime方法中将Procedure参数指定为该过程自身,即“会议提醒”。运行该过程后,将会每隔30分钟收到一次会议提醒的提示信息。

有时可能需要取消已经进入自动执行状态的VBA过程,尤其是像上面设置为以指定时间间隔重复运行的VBA过程,为此需要将OnTime方法的第4个参数设置为False。

案例4-13 取消定时任务

下面的代码在模块顶部的声明部分创建了一个名为datTime的模块级变量,用于存储需要停止自动运行的VBA过程的时间安排,该变量中的值可在模块中的各个过程之间传递。运行名为“会议提醒”的过程后,将会每隔30分钟自动运行该过程自身。如果要停止执行该任务计划,则需要运行名为“取消会议提醒”的过程。

4.4.2 为VBA过程指定快捷键

使用Application对象的OnKey方法可以为指定的VBA过程设置快捷键,按下快捷键后将会执行该过程。OnKey方法的功能与“录制宏”对话框中的快捷键设置类似,但是可以提供更多的按键选择,比如由Ctrl、Shift、Alt键与其他按键的组合。OnKey方法的语法格式如下:

    Application.OnKey(Key, Procedure)

□ Key:必选,要指定给VBA过程的快捷键,可以是单个按键或多个按键的组合。

□ Procedure:可选,要设置快捷键的VBA过程的名称。

表4-3列出了除字母键、数字键和符号键之外的其他按键在OnKey方法中的表示方式。字母键、数字键和符号键表示为其本身,比如字母A在OnKey中表示为“A”。符号键中的^、+和%分别用于表示Ctrl、Shift和Alt键,因此如果要将这3个键作为快捷键组合中的按键,那么需要为它们加上大括号,比如由Ctrl与加号键组成的组合键表示为“^{+}”。

表4-3 按键在OnKey方法中对应的代码

案例4-14 使用快捷键加快过程的运行速度

下面的代码将Ctrl+C组合键指定给名为“显示欢迎信息”的过程。之后运行名为“设置快捷键”的过程,然后就可以使用Ctrl+C组合键来运行名为“显示欢迎信息”的过程,该组合键默认的用于完成复制操作的功能将被“显示欢迎信息”过程代替。

提示:指定快捷键的过程只需运行一次,快捷键即可在当前打开的所有工作簿中有效,但有效期仅在Excel程序运行期间。

如果希望将按键恢复为Excel的默认功能,则可以省略OnKey方法的第二参数,下面的代码恢复Ctrl+C组合键在Excel中的默认功能:

    Application.OnKey "^c"

如果要禁用按键的正常功能,则可以将OnKey方法的第二参数设置为空字符串。下面的代码禁用完成复制操作的组合键Ctrl+C:

    Application.OnKey "^c", ""

上面代码中使用的是小写字母C,如果改为大写字母C,则“^C”表示的是Ctrl+Shift+C组合键。

4.4.3 向其他程序发送按键信息

使用Application对象的SendKeys方法可以发送按键信息来控制不支持其他交互形式的应用程序,比如OLE或DDE。SendKeys方法的语法格式如下:

    Application.SendKeys(Keys, Wait)

□ Keys:必选,以字符串形式发送给其他程序的一个或多个按键。按键在SendKeys方法中的表示方式与OnKey方法相同,具体的按键代码可参考4.4.2节。

□ Wait:可选,一个Boolean类型的值。如果为True则Excel会等到处理完按键后将控制权交给当前的VBA过程,如果为False则继续运行程序而不会等到处理完按键。如果省略该参数,则默认其值为False。

案例4-15 使用SendKeys方法发送按键信息

下面的代码启动Windows系统中的记事本程序,并在其中输入了“Hello”,然后打开记事本程序的“另存为”对话框。

    Sub 使用SendKeys方法发送按键信息()
        Shell "notepad.exe", vbNormalFocus
        Application.SendKeys "Hello", True
        Application.SendKeys "%fa"
    End Sub

提示:当前处于活动状态的语言输入法会影响SendKeys方法发送按键信息的结果。

当需要在对话框中填写一些内容,比如密码,那么必须在显示对话框之前,先使用SendKeys方法发送与输入的内容对应的按键信息。

案例4-16 使用SendKeys方法向对话框发送按键信息

下面的代码在对话框中填写“Hello”,在显示由InputBox函数产生的对话框之前,先使用SendKeys方法发送了按键信息。

    Sub 使用SendKeys方法向对话框发送按键信息()
        Application.SendKeys "Hello", True
        InputBox "请输入问候语:"
    End Sub

4.4.4 计算字符串表达式

使用Application对象的Evaluate方法可以将一个字符串表达式转换为一个Excel对象或一个值,语法格式如下:

    Application.Evaluate(Name)

该方法只有一个参数,表示要进行转换的字符串表达式。

Evaluate方法还支持一种更简洁的格式:使用一对方括号将字符串表达式包围起来,不需要使用Evaluate关键字。下面两行代码的作用相同,都用于引用A1单元格:

    Application.Evaluate ("A1")
    [A1]

下面两行代码都可以计算2、5和8三个数的乘积。使用Evaluate方法时可以省略其左侧的Application对象。

    Evaluate("2*5*8")
    [2*5*8]

使用方括号的优点是可以使代码更简洁。使用Evaluate关键字的优点在于可以随意组合构成其参数的字符串表达式,而且可以在其中使用变量,让字符串表达式变得更灵活。

案例4-17 在Evaluate方法中使用变量

下面的代码用于计算由用户指定的数字的平方根,在Evaluate方法的参数中使用了一个变量,该变量存储用户在对话框中输入的数字。

注意:上面代码中用于计算平方根的函数是工作表中的SQRT函数,不能在Evaluate方法中以字符串的形式使用VBA内置的SQR函数,否则会出现运行时错误。

4.4.5 在VBA中使用Excel工作表函数

在VBA中可以使用两组内置函数,一组函数是VBA语言元素中的一部分,另一组函数是在Excel工作表公式中使用的函数。在VBA代码中可以直接使用VBA内置函数,而如果要在VBA代码中使用Excel工作表函数,则需要通过Application对象的WorksheetFunction属性来实现。Application对象的WorksheetFunction属性返回WorksheetFunction对象,该对象包含的方法就是Excel工作表函数的子集。

如果一个VBA内置函数和一个Excel工作表函数具有相同的功能,那么在VBA代码中就不能直接使用Excel工作表函数。例如,VBA内置的SQR函数与Excel工作表函数SQRT都可用于计算数字的平方根,因此在VBA中只能使用SQR函数,而不能直接使用SQRT函数。如果要在VBA中使用与SQR函数具有相同功能的工作表函数SQRT,则需要使用前面介绍的Evaluate方法以字符串的形式来实现。

VBA内置函数并没有提供很多常用的计算和统计功能,比如求和、计数、求最大值/最小值等,而使用现成的工作表函数则可以使代码的编写更简单。

案例4-18 在VBA中使用工作表函数

下面的代码要求用户在对话框中输入以英文逗号分隔的多个数字,然后使用VBA内置的Split函数将其解析为一个数组,最后使用Excel工作表函数COUNTA统计该数组中包含的元素个数。本例代码的运行效果如图4-11所示。

    Sub 在VBA中使用工作表函数()
        Dim varNumbers As Variant
        varNumbers = Split(InputBox("请输入以英文逗号分隔的多个数字:"), ",")
       MsgBox "一共输入了" & Application.WorksheetFunction.CountA(varNumbers) & "个数字"
    End Sub

图4-11 使用工作表函数统计输入数字的个数

提示:Split函数一共有4个参数,最常用的是前两个参数,第一个参数表示要解析为数组的字符串,第二个参数表示用于标识子字符串边界的字符,子字符串就是要作为解析为数组中包含的数组元素。