Set wks = Worksheets(\ Set rng = wks.Range(\
Application.Run \ '也能够使用下面的语句完成相同的任务 ' Call MyProc(rng) End Sub
Sub MyProc(rng As Range) With rng.Font .Bold = True End With End Sub
Application对象相关的事件
Application对象也有一些事件,能够用于监视整个Excel应用程序的行为。要使用Application事件,必须启用事件监视。
激活Application事件监视
1、单击“插入——类模块”,创建一个类。 2、在属性中,将类的名称改为AppEventClass。 3、在类的代码窗口,添加下面的代码: Public WithEvents Appl As Application
现在,能够在应用程序中运用应用程序级事件。 4、在代码窗口顶部左侧的对象列表中,选择Appl。
5、在代码窗口顶部右侧的过程列表中,选择WorkbookOpen。此时,将为Appl_WorkbookOpen过程插入一对占位符。
6、在过程中添加下面的语句:
Private Sub Appl_WorkbookOpen(ByVal Wb As Workbook) MsgBox \已打开工作簿.\
7、重复上面的步骤插入Appl_WorkbookBeforeClose事件,并添加下面的语句: Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) MsgBox \关闭工作簿.\
8、接下来,创建一个变量用于引用类模块中创建的Application对象。在工程资源管理器中,双击ThisWorkbook打开代码窗口。
9、添加下面的语句。
Dim ApplicationClass As New AppEventClass
通过在ThisWorkbook代码窗口添加下面的语句,创建所声明的对象对Application对象的连接:
Private Sub Workbook_Open()
Set ApplicationClass.Appl = Application
End Sub
10、保存并关闭该工作簿。
11、现在,测试代码。打开该工作簿,将触发Appl_WorkbookOpen事件,显示相应的信息框。
12、关闭该工作簿,将触发Appl_WorkbookBeforeClose事件,显示相应的信息框。 13、切换回AppEventClass类模块并单击过程列表显示能够用于监控应用程序行为的一系列事件。
理解这些事件如何被触发以及事件的顺序对理解应用程序是重要的。在类模块中添加其他的事件并插入消息框,然后试验不同的行为来看看何时触发某特定的事件。
使用Application对象执行其它任务
除了Application对象中最常用的对象外,您可能希望在Excel应用程序中执行一些其他任务。下面我们就来探讨这方面的内容。
删除工作表而显示提示信息(DisplayAlerts属性)
下面的示例首先关闭询问是否保存工作表的任何消息,接着删除工作表并打开警告消息。
Sub DeleteSheet()
Application.DisplayAlerts = False ActiveSheet.Delete
Application.DisplayAlerts = True End Sub
上述示例代码中使用了DisplayAlerts属性,将其值设置为False以自动执行Excel警告对话框中默认按钮相关的操作。
设置DisplayAlerts属性的意图在于,运行宏时不必响应系统出现的警告而使执行过程中断。当然,在过程结束前,最好将DisplayAlerts属性设置为True。
无须提示用户而保存工作表(DisplayAlerts属性) 下面的示例保存工作表,而没有通知用户是否保存。 Sub SaveWorksheet()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs \ Application.DisplayAlerts = True End Sub
此时,如果现有文件与要保存的文件名相同,那么会覆盖该文件而不会弹出任何警告消息。
使用SendKeys方法发送信息到记事本
SendKeys方法允许发送按键到当前活动窗口,用来控制不支持任何其他交互形式的应用程序,例如DDE(动态数据交换)或OLE。
下面的示例使用SendKeys命令从Excel中复制数据区域到记事本,然后保存该文件。 Sub SKeys()
Range(\复制单元格区域 SendKeys \最小化Excel
Shell \开启记事本 SendKeys \将数据粘贴到记事本 SendKeys \指定另存为 SendKeys \提供文件名 SendKeys \保存文件 End Sub
本示例首先复制数据区域到剪贴板,然后最小化Excel,开启记事本,接着从剪贴板复制数据到记事本,最后指定文件名并保存文件。
下面的示例打开了“记事本”应用程序(不支持DDE或OLE),并将数据行写入记事本文档:
Sub SKeys()
Dim dReturnValue As Double
dReturnValue = Shell(\ AppActivate dReturnValue
Application.SendKeys \ Application.SendKeys \
Application.SendKeys \End Sub
注意,应该在Excel应用程序窗口执行上述程序。
下面的过程清除VBE立即窗口中的内容。如果在立即窗口中进行过试验或者使用Debug.Print语句在立即窗口输出数据,那么旧的信息将产生混乱。该过程将焦点转移到立即窗口,发送选择该窗口中的所有文本,然后发送Del键删除文本:
Sub ImmediateWindowClear()
Application.VBE.Windows.Item(\立即窗口\ Application.SendKeys \ Application.SendKeys \End Sub
注意,要使上述代码运行,必需编程访问Visual Basic工程。从Excel功能区中选择“开发工具”选项卡,选择“宏安全性”,然后勾选“信任对VBA工程对象模型的访问”。
其中,百分比符号(%)用于代表Alt键,波形符号(~) 代表回车键,^符号代表Ctrl键。在花括号{}里放置名称指定其它特别的键,例如{Del}代表Delete键。
安排宏在指定的时间和间隔运行(OnTime方法)
可以使用Application对象的OnTime方法在指定的时间或者在有规律的时间间隔运行某过程。OnTime方法的语法如下:
Application.OnTime(EarliestTime,Procedure,LastestTime,Schedule)
参数EarliestTime指明希望何时运行由参数Procedure指定的过程,可选的参数LastestTime和Schedule指明过程运行的最迟时间,以及是否安排运行一个新过程或者删除已经存在的过程。当开始调用某过程而Excel正忙时,则需要使用参数LastestTime指定希望调用该过程的时间区间。如果使用Application对象的Wait方法暂停某宏,所有的Excel行为,包括手工交互操作,都将被挂起。OnTime方法的优势在于,当等待运行安排的宏时,允许返回正常的Excel交互操作,包括运行其他的宏。
下面的示例指定每隔5分钟运行一次名为YourProc的过程: Application.OnTime EarliestTime:=Now + TimeValue(\Procedure:=\
下面的示例在每天中午运行过程YourProc:
Application.OnTime EarliestTime:=TimeValue(\下面的示例安排每隔5分钟调用一次AutoSave过程。如果关闭该工作簿,则调用CleanUp过程来执行可能希望的清理以及删除任何额外的调用。
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue(\End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next
Application.OnTime Now + TimeValue(\End Sub
注意,Workbook_Open事件和Workbook_BeforeClose事件包含在工作簿代码模块中,而AutoSave过程和CleanUp过程则存在于标准代码模块中。
当使用OnTime方法安排在将来的某个时间运行宏时,必须确保Excel一直在内存中运行直至到达安排的时间。但不需要一直打开包含OnTime宏的工作簿。如果需要,Excel将打开该工作簿。
通过上述简介,我们已经了解了OnTime方法的基本用法。下面再详细介绍OnTime方法。
有时,我们可能需要设计Excel工作簿定期并自动地运行一个过程。例如,可能希望每隔几分钟从数据源中更新数据,此时执行Excel应用程序的OnTime方法指令Excel在给定的时间去运行某过程。通过编写代码使程序自已调用OnTime方法,能使VBA代码定期自动执行。
OnTime方法要求指定日期和时间以及要运行的过程作为参数,重要的是要记住具体
地告诉Excel什么时候运行这个过程而不是从当前时间开始的偏差。为了取消一个未执行的OnTime过程,必须经过该过程计划要运行的确切的时间,不能够告诉Excel取消下一个计划执行的过程。因此,建议将安排过程开始运行的时间存放在一个公共的(或全局)变量中,该变量作用于所有的代码。然后,能够使用所存储时间的变量去安排运行或取消事件。下面的示例代码在公共的常量中存储了所运行过程的名称和重复执行的时间间隔,当然这不是必需的。
Public RunWhen As DoublePublic Const cRunIntervalSeconds = 120 ' two minutesPublic Const cRunWhat = \
为开始这个过程,使用一个名为 StartTimer的子程序。代码如下: Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, schedule:=True
End Sub
将比当前时间多两分钟的日期和时间存放在RunWhen变量中,然后调用OnTime方法指令Excel何时运行cRunWhat过程。
“The_Sub”是一个字符串变量,Excel将在合适的时间运行该过程。下面是该过程代码示例:
Sub The_Sub()
' '这里放置代码 ' StartTimer End Sub
注意,The_Sub过程的最后一行调用了StartTimer过程,再次重复运行这个过程。并且当下次使用OnTime调用The_Sub过程时,将再次调用StartTimer来重复执行它自已。这就是如何执行周期循环的方法。
有时,当关闭工作簿时或者满足某个条件时需要停止定时执行的过程。由于OnTime方法是Application对象的一部分,简单地关闭已创建事件的工作簿不会取消对OnTime的调用。一旦Excel自身保持运行,它将执行OnTime过程,并且在必要时会自动打开该工作簿。
为了停止OnTime过程,必须对OnTime方法指定确切的时间,这就是我们将时间作为公共的变量存放在RunWhen中的原因。否则,没办法知道过程计划执行的确切时间。(所计划的时间像OnTime方法中的一把“钥匙”,如果没有它,就没有通往事件的入口)
下面是一个名为StopTimer的子过程,它将停止要执行的OnTime过程。 Sub StopTimer() On Error Resume Next
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, schedule:=False