Project Server 2013 – Disable Local Resources – Part 2

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.

Related Posts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.