Earlier in part 1 of disable local resources I described the aim of disabling the use of local resources. Today I will show you how to implement this.
There are two modules we’re going to develop
- This Project
- Resource check Class module
The resource check class module is giving us the event handlers that can be used by the solution. First Create a new class module and call it ResourceCheck.
Add to the class module the following line:
Public WithEvents App As Application
Each task in my project can have a the following situations.
- No resources assigned to a task
- All resources are enterprise resources
- All resources are local
- There are incomplete resources (enterprise resources without an account assigned to them)
Then for the different situations we’re creating an enumeration and a variable storing the Checkresults:
Private Enum ResourceCheckResults ย ย ย
ย ย ย ย Unknown ย ย ย
ย ย ย ย AllEnterprise ย ย ย
ย ย ย ย LocalResource ย ย ย
ย ย ย ย IncompleteEnterpriseResource
End Enum
Dim ResCheckResult As ResourceCheckResults
Then to create a function which checks a resource collection and returns site what type of resources are found.
Public Function GetCheckResultForResources(Resources) As Integer
ย ย ย Dim CheckResults As ResourceCheckResults: CheckResults = Unknown ย ย ย
ย ย ย For Each Resource In Resources ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย If Resource.Enterprise Then ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย If CheckResults = Unknown Or CheckResults = AllEnterpriseResources Then ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Resource.EMailAddress = “” Or Resource.WindowsUserAccount = “” Then ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CheckResults = IncompleteEnterpriseResource ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Else ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CheckResults = AllEnterpriseResources ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย End If ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย Else ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CheckResults = LocalResource ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย End If ย ย ย
ย ย ย ย Next Resource ย ย ย ย ย ย
ย ย ย ย GetCheckResultForResources = CheckResults
End Function ย ย
Ok so the base work has now been done. Now we need to make sure that the results are checked when a user updates the resources in a project. There are quite a few event handlers relevant here.
The event handlers I’ve considered here are:
- App_ProjectBeforeAssignmentChange – Occurs before the user changes the value of an assignment field.
- App_ProjectBeforeAssignmentDelete – Occurs before an assignment is removed or replaced
- App_ProjectBeforeResourceChange – Occurs before the user changes the value of a resource field
- App_ProjectBeforeTaskChange – Occurs before the user changes the value of a task field
- App_ProjectBeforeSave2 – Occurs before a project is saved.
ProjectBeforeAssignmentChange
When a resource is assigned to a task the following event handler will check if an Enterpriseย or a local user is added. When a local user is added the assignement is cancelled.
Private Sub App_ProjectBeforeAssignmentChange(ByVal asg As Assignment, ByVal Field As PjAssignmentField, ByVal NewVal As Variant, Cancel As Boolean) ย ย ย
ย ย ย ย On Error GoTo ErrHandler:ย ย ย ย
ย ย ย ย If (asg.Resource.Enterprise) Then ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย If (ResCheckResult = Unknown Or ResCheckResult = AllEnterprise) Then ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ResCheckResult = AllEnterprise ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย End If ย ย ย ย ย ย ย
ย ย ย ย ย ย Elseย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ResCheckResult = LocalResource ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย MsgBox (asg.Resource.Name & ” is NOT an enterprise user”) ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย Cancel = True ย ย ย
ย ย ย ย ย End If ย ย ย ย ย ย
ย ย ย ย ย ย Exit Sub ErrHandler: ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ‘ No need to do anything just ignore the error ย ย ย
ย ย ย ย ย ย Exit Sub ย ย ย
End Sub
ProjectBeforeAssignmentDelete
As part of the solution I changed the colour of the resource. Depending on if we’re talking about a Local or an Enterprise resource. Therefore when a resource is deleted the colour of the task’s resource needs to be reviewed
Private Sub App_ProjectBeforeAssignmentDelete(ByVal asg As Assignment, Cancel As Boolean) ย ย ย
ย ย ย ย On Error GoTo ErrHandler: ย ย ย
ย ย ย ย ResCheckResult = GetCheckResultForResources(asg.Task.Resources) ย ย ย
ย ย ย ย Select Case CheckResults ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย Case LocalResource ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย asg.Application.ActiveCell.FontColor = pjRed ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย Case Unknown ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย asg.Application.ActiveCell.FontColor = pjBlack ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย Case AllEnterprise ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย asg.Application.ActiveCell.FontColor = pjBlack ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย Case IncompleteEnterpriseResource ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย asg.Application.ActiveCell.FontColor = pjBlue ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย End Select ย ย ย
ย ย ย ย ย ย ย ย ย ย Exit Sub
ย ย ย ย ย ย ย ย ย ErrHandler: ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ‘ย No need to do anything just ignore the error ย ย ย
ย ย ย ย ย ย ย ย ย Exit Sub
End Sub
ProjectBeforeResourceChange
Private Sub App_ProjectBeforeResourceChange(ByVal res As Resource, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean) ย ย ย
ย ย ย ย If (res.Enterprise) Then ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย Debug.Print (res.Name & ” is an enterprise user”) ย ย ย
ย ย ย ย ย Else ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย MsgBox (NewVal & ” is NOT an enterprise user”) ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย Cancel = True ย ย ย
ย ย ย ย ย End If
End Sub
ProjectBeforeTaskChange
Private Sub App_ProjectBeforeTaskChange(ByVal tsk As MSProject.Task, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean) ย ย ย
ย ย ย ย ย On Error GoTo ErrHandler: ย ย ย
ย ย ย ย ย CheckResults = GetCheckResultForResources(tsk.Resources) ย ย ย ย ย ย
ย ย ย ย ย Select Case CheckResults ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย Case LocalResource ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย tsk.Application.ActiveCell.FontColor = pjRed ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย Case Unknown ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย tsk.Application.ActiveCell.FontColor = pjBlack ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย Case AllEnterprise ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย tsk.Application.ActiveCell.FontColor = pjBlack ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย Case IncompleteEnterpriseResource ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย tsk.Application.ActiveCell.FontColor = pjBlue ย ย ย
ย ย ย ย ย End Select ย ย ย ย ย ย
ย ย ย ย ย Exit Sub ย ย ย
ย ย ย ย ย ย ErrHandler: ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ‘ Just ignore the errors ย ย ย
ย ย ย ย Exit Sub ย ย ย ย ย ย ย
End Sub
ProjectBeforeSave2
Private Sub App_ProjectBeforeSave2(ByVal pj As Project, ByVal SaveAsUi As Boolean, ByVal Info As EventInfo) ย ย ย
ย ย ย ย Dim MyResource As Resource ย ย ย
ย ย ย ย Dim ResourceID ย ย ย
ย ย ย ย Dim LocalResources As String ย ย ย
ย ย ย ย Dim EnterWithoutEmail As String ย ย ย
ย ย ย ย Dim EnterWithoutAccount As String ย ย ย
ย ย ย ย Dim NewColour ย ย ย ย ย ย
ย ย ย ย If ThisProject.Application.Projects.Count > 0 Then ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย For Each Task In ThisProject.Application.Projects(1).Tasks ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Not Task Is Nothing Then ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย For Each MyResource In Task.Resources ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Not MyResource.Enterprise Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย LocalResources = LocalResources + MyResource.Name + “;”
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If MyResource.EMailAddress = “” Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย EnterWithoutEmail = EnterWithoutEmail + MyResource.Name + “;”
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If MyResource.WindowsUserAccount= “” Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย EnterWithoutAccount = EnterWithoutAccount + MyResource.Name + “;”
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Next MyResource
ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย Next Task
ย ย End If
ย ย ย If LocalResources + EnterWithoutEmail + EnterWithoutAccount <> “” Then
ย ย ย ย ย ย ย If LocalResources = “” Then
ย ย ย ย ย ย ย ย ย ย ย MsgBox (“Please report the following details to your system administrator: ” & vbNewLine & “Enterprise resources without email: ” & EnterWithoutEmail & vbNewLine & vbNewLine & “Enterprise resources without account: ” & EnterWithoutAccount)
ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย If EnterWithoutEmail + EnterWithoutAccount = “” Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย MsgBox (“Please remove the following local resources: ” & vbNewLine & LocalResources)
ย ย ย ย ย ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย ย ย ย MsgBox (“Please remove the following local resources: ” & vbNewLine & LocalResources & vbNewLine & vbNewLine & “Please report the following details to your system administrator: ” & vbNewLine & “Enterprise resources without email: ” & EnterWithoutEmail & vbNewLine & vbNewLine & “Enterprise resources without account: ” & EnterWithoutAccount)
ย ย ย ย ย ย ย ย ย ย ย ย ย ย Info.Cancel = True
ย ย ย ย ย ย ย ย ย ย ย End If ย
ย ย ย ย ย ย End If ย
ย ย End If
End Sub
Then now the final steps. How do we get the Event handlers to run.
Open the This project and specify the following variables and Enumeration:
Dim MyApp As New ResourceChecks
Private Enum TaskResourceCheckResults ย ย ย
ย ย ย ย Unknown ย ย ย
ย ย ย ย AllEnterpriseResources ย ย ย
ย ย ย ย LocalResource ย ย ย
ย ย ย ย IncompleteEnterpriseResource
End Enum
Then there are a couple of Subs to make our live easier:
UpdateResourceColours
Private Sub UpdateResourceColours(Tasks As Object) ย ย ย ย ย ย
ย ย Dim NewColour ย ย ย
ย ย Dim OldColour ย ย ย
ย ย Dim TaskLine ย ย ย ย ย ย
ย ย ย
ย ย On Error GoTo ErrHandler: ย ย ย
ย ย TaskLine = 0 ย ย ย
ย ย ย For Each Task In Tasks ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย TaskLine = TaskLine + 1 ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย If Task Is Nothing Then ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ‘Blank lines to be ignored ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย Else ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย SelectRow Task.UniqueID, RowRelative:=False
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย SelectTaskField Row:=TaskLine, RowRelative:=False, Column:=”Resource Names”
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย OldColour = MyApp.App.ActiveCell.FontColor
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Task.Resources.Count = 0 Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NewColour = pjBlack
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CheckResults = MyApp.GetCheckResultForResources(Task.Resources)
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Select Case CheckResults
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Case LocalResource
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NewColour = pjRed
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Case Unknown
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NewColour = pjBlack
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Case AllEnterprise
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NewColour = pjBlack
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Case IncompleteEnterpriseResource
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NewColour = pjBlue
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End Select
ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย End If
ย ย ย ย ย ย If NewColour <> OldColour Then
ย ย ย ย ย ย ย ย ย ย ย Font Color:=NewColour
ย ย ย ย ย ย End If
Next Task
ย ย ย ย SelectRow Tasks(1).UniqueID, RowRelative:=False
Exit Sub
ย ย ErrHandler:
ย ย ย ย ย If MyApp.App Is Nothing Then
ย ย ย ย ย ย ย ย ย ย MsgBox (“Please reload your project”)
ย ย ย ย ย ย ย ย ย ย ย Exit Sub
ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย Exit Sub
ย End Sub
Report_LocalResources
Private Sub Report_LocalResources(ByVal pj As Project)
On Error GoTo ErrHandler: ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย For Each Resource In pj.Resources
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Not Resource.Enterprise Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If Resource.Name = Empty Then ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ‘ An Empty resource has been added to the project resources. This one needs to be removed too ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If LocalResourceList = Empty Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย LocalResourceList = Resource.ID
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NumLocalResources = 1
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย LocalResourceList = LocalResourceList & “,” & Resource.ID
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NumLocalResources = NumLocalResources + 1
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย If LocalResourceList = Empty Then
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย LocalResourceList = Resource.Name
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NumLocalResources = 1
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Else
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย LocalResourceList = LocalResourceList & “,” & Resource.Name
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย NumLocalResources = NumLocalResources + 1
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย ย ย ย ย ย ย ย ย End If
ย ย ย ย ย Next Resource
ย ย ย ย ย ย ย ย If LocalResourceList <> Empty Then
ย ย ย ย ย ย ย ย ย ย ย ย ย MsgBox (NumLocalResources & ” local resources have been found Please remove these resources from the Resources, Add Resources, Build team from Enterprise option in the Project”)
ย ย ย ย ย ย End If
ย ย ย ย ย ย ย Exit Sub
ErrHandler: ย ย ย ‘ Ignore Errorsย ย ย ย
ย ย ย ย ย ย ย ย Exit Sub
End Sub
Ok so now all the hard work has been done all we need to do is create an object when a project is opened and call ourfunctions and subs to update the resource names column’s colour.
Private Sub Project_Open(ByVal pj As Project)
ย ย ย ย ย ย ย ย ย On Error GoTo ErrHandler:
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Dim CheckResult As TaskResourceCheckResults
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย CheckResults = Unknown
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Set MyApp.App = Application
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย UpdateResourceColours pj.Tasks
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Exit Sub
ErrHandler:
ย ย ย ย ย ย ย ย ย ‘ Ignore Errors
ย ย ย ย ย ย ย ย Exit Sub
End Sub
Private Sub Project_BeforeSave(ByVal pj As Project)
On Error GoTo ErrHandler:
ย ย ย ย ย ย Dim LocalResourceList As String: LocalResourceList = Empty
ย ย ย ย ย Dim NumLocalResources As Integer ย ย ย Debug.Print (“BeforeSave”)
ย ย ย ย ย ย UpdateResourceColours pj.Tasks
ย ย ย ย ย ย Report_LocalResources pj
ย ย ย ย ย Exit Sub ย ย ย
ErrHandler:
ย ย ย ย ย ‘ Ignore Errors
ย ย ย ย ย Exit Sub
End Sub
Discover more from SharePains
Subscribe to get the latest posts sent to your email.