Using events with Application and Project objects

You can write event procedures at the application level or the project level. For example, the Activate event occurs at the project level when a project is activated and the NewProject event occurs at the application level when a project is created.

Event procedures in the Project object are available for any open project. To write event procedures for the Application object, you must create a new object using the WithEvents keyword in a class module. The following steps show how to create and test a simple application event handler:

  1. In the Visual Basic Editor, on the option menu for VBAProject, choose Insert, and then choose Class Module to create a class named Class1. You can rename the class module in the Properties pane. In the following examples, the class is named TestClass.

  2. Paste the following code in the TestClass module.

  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. Open the ThisProject module and paste in the following code.
  Option Explicit 
Private tClass As New TestClass 
 
Sub TestNewProjectEvent() 
    Set tClass.oApp = Application 
    tClass.oApp.Projects.Add 
    Projects.Add 
End Sub
  1. Run the TestNewProjectEvent macro. The macro calls the Projects.Add method twice—once through the TestClass object and once directly through the Application object. When the Project application creates the first project, the result is a Microsoft Project dialog box with the message You created the Project2 project. When you choose OK, Project creates the second project and shows another dialog box with the message You created the Project3 project.

Important For application-level events, register event handlers after you set Application.Visible = True.

If you instantiate Project from another application and register an application-level event before setting the Visible property of the Application object to True, the properties and methods of child objects of Application don't work. For example, Application.ActiveProject.Name is not accessible.

Note Event code in your project can run unexpectedly, or can be blocked, if event code exists in the global file (Global.mpt).

  • If code exists for an event in both the global files and project files, only the code in the project event runs.

  • If code for an event does not exist in a project, but does exist in the global file, the code in the global event runs.

  • If code for one of the three events Application.ProjectBeforeClose, Application.ProjectBeforeSave, or Project.Open exists in the global file, but not in the project, it affects both the global and project files. If code exists for those events in both the global and project files, the code in the global file affects the global file, and the code in the project file affects the project.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.