结合使用事件与 Application 和 Project 对象

可以编写应用程序级别或项目级别的事件过程。 例如,激活项目时,将在项目级别发生 Activate 事件;创建项目时,将在应用程序级别发生 NewProject 事件。

Project 对象中的事件过程可用于任何已打开的项目。 若要为 Application 对象编写事件过程,必须在类模块中使用 WithEvents 关键字创建新的对象。 下列步骤说明如何创建和测试简单的应用程序事件处理程序:

  1. 在 Visual Basic 编辑器中 “VBAProject” 的选项菜单上选择“插入”,然后选择“类模块”创建名称为“Class1”的类。 可以在“属性”窗格中重命名该类模块。 下面的示例将此类命名为“TestClass”。

  2. 将以下代码粘贴到 TestClass 模块中。

  Option Explicit 
Public WithEvents oApp As Application 
 
Private Sub oApp_NewProject(ByVal pj As Project) 
    MsgBox "You created the " & pj.Name & " project." 
End Sub 
 
Private Sub Class_Initialize() 
    ' Add class initialization statements here, if needed. 
End Sub 
  1. 打开 ThisProject 模块,然后粘贴以下代码。
  Option Explicit 
Private tClass As New TestClass 
 
Sub TestNewProjectEvent() 
    Set tClass.oApp = Application 
    tClass.oApp.Projects.Add 
    Projects.Add 
End Sub
  1. 运行 TestNewProjectEvent 宏。 此宏调用 Projects.Add 方法两次,一次通过 TestClass 对象,另一次直接通过 Application 对象。 当 Project 应用程序创建第一个项目时,会出现一个 "Microsoft Project"对话框,其中显示 "您创建了 Project2 项目"消息。 如果选择“确定”,Project 将创建第二个项目并显示另一个对话框,其中显示“你创建了 Project3 项目”消息。

重要对于应用程序级事件,请在设置 Application.Visible = True注册事件处理程序。

如果从其他应用程序实例化“项目”,并在将“应用程序”对象的“可见”属性设置为“True”之前注册了应用程序级别的事件,“应用程序”的子对象属性和方法将不起作用。 例如,Application.ActiveProject.Name 将无法访问。

注意 如果事件代码存在于全局文件 (Global.mpt) 中,则项目中的事件代码可能运行异常,也可能被阻止。

  • 如果事件的代码同时存在于全局文件和项目文件中,则只有项目事件中的代码运行。

  • 如果事件的代码不存在于项目中,但存在于全局文件中,则全局事件中的代码运行。

  • 如果 Application.ProjectBeforeCloseApplication.ProjectBeforeSaveProject.Open 这三个事件中的某一个事件的代码存在于全局文件中,但不存在于项目中,则它会影响全局文件和项目文件。 如果这些事件的代码同时存在于全局文件和项目文件中,则全局文件中的代码会影响全局文件,而项目文件中的代码会影响项目。

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。