Example vba code
Most of these macros are examples that were first published on Jack Dahlgren's website Masamiki https://masamiki.com/project/macros.htm. This page seems to have been moved or deleted so I am publishing here for moment. If you know where the original macros are please
contact me so I can link to the page and give Jack the proper credit.
- Remove non-logic constraints
- Restore non-logic constraints
- Remove all constraints
- Restore constraints
- Add notes to multiple tasks
- Add text to the start of multiple Task Names
- Add text to the finish of multiple Task Names
Macro to Remove non-logic constraints
This macro removes all constraints from tasks with predecessors. A constraint fixes a start to a particular date. For example 'start no earlier than' x date or 'must start on' x date. Often constraints are accidently created by copying and pasting tasks or setting start or finish dates without fully understanding the consequences. Tasks that have predecessors are not likely to also be fixed to a certain date. However, there are exceptions to this, so before you run this macro make sure you understand
what constraints are for and the
common mistakes in using constraints.
'Macros to Remove contraints from tasks that are kept in place by logic
'This sets the tasks to have a constraint type of 0 which is "As Soon As Possible"
'You can reverse it by running Restore_NonLogic_Contraints
'Copyright Jack Dahlgren 4/17/00
'Tamzin Morphy (https://www.stakeholdermap.com/ms-project/ms-project-vba.html) - Changed = vbNo Then End (causing automation error) to = vbno Then Exit Sub
Sub Remove_NonLogic_Constraints()
Dim ProjTasks As Tasks
Dim ProjTask As Task
Dim TaskDeps As TaskDependencies
If MsgBox("This Macro will remove All Constraints from tasks that have predecessors. Do you want to continue?",
vbYesNo) = vbNo Then Exit Sub
Set ProjTasks = ActiveProject.Tasks
For Each ProjTask In ProjTasks 'these if statements step through all tasks in the project
If Not (ProjTask Is Nothing) Then 'this handles blank line in the file
If ProjTask.Summary = False Then 'this handles summary tasks which are only allowed to be fixed duration
If ProjTask.ExternalTask = False Then 'this handles external tasks
ProjTask.Date1 = "" 'Clears the field we use to restore original constraint date
ProjTask.Number15 = 0 'Clear the field we use to restore constraint type
If ProjTask.TaskDependencies.Count > 0 Then 'selects tasks with 1 or more dependencies
ProjTask.Date1 = ProjTask.ConstraintDate 'Stores restore data into fields
ProjTask.Number15 = ProjTask.ConstraintType 'Stores restore data into fields
ProjTask.ConstraintType = 0 'Sets task to as soon as possible
End If
End If
End If
End If
Next ProjTask
End Sub
Macro to Restore non-logic constraints
'Macro to Restore contraints that were erased by the Remove_NonLogic_Contraints() macro
'This sets resets the tasks to have their original constraint types and dates
'Copyright Jack Dahlgren 4/17/00
'Tamzin Morphy (https://www.stakeholdermap.com/ms-project/ms-project-vba.html)- Changed = vbNo Then End (causing automation error) to = vbno Then Exit Sub
Sub Restore_NonLogic_Contraints()
Dim ProjTasks As Tasks
Dim ProjTask As Task
Dim TaskDeps As TaskDependencies
If MsgBox("This Macro will restore All Constraints for tasks that have predecessors. Do you want to continue?", vbYesNo) = vbNo Then Exit Sub
Set ProjTasks = ActiveProject.Tasks
For Each ProjTask In ProjTasks 'these if statements step through all tasks in the project
If Not (ProjTask Is Nothing) Then 'this handles blank line in the file
If ProjTask.Summary = False Then 'this handles summary tasks which are only allowed to be fixed duration
If ProjTask.ExternalTask = False Then 'this handles external tasks
If ProjTask.TaskDependencies.Count > 0 Then 'Selects only tasks with dependencies
ProjTask.ConstraintType = ProjTask.Number15 'restores data from storage fields
ProjTask.ConstraintDate = ProjTask.Date1 'restores data from storage fields
End If
End If
End If
End If
Next ProjTask
End Sub
Macro to Remove all constraints
'Macro to remove all task constraints
'This sets the tasks to have a constraint type of 0 which is "As Soon As Possible"
'You can reverse it by running Restore_NonLogic_Contraints
'Tamzin Morphy (https://www.stakeholdermap.com/ms-project/ms-project-vba.html) - Tweak to Remove_NonLogic_Constraints by Jack Dahlgren 4/17/00 - remove all constraints.
'Copyright T Morphy 29/07/2014
Sub Remove_All_Constraints()
Dim ProjTasks As Tasks
Dim ProjTask As Task
Dim TaskDeps As TaskDependencies
If MsgBox("This Macro will remove All Constraints from tasks. Do you want to continue?", vbYesNo) = vbNo Then Exit Sub
Set ProjTasks = ActiveProject.Tasks
For Each ProjTask In ProjTasks 'these if statements step through all tasks in the project
If Not (ProjTask Is Nothing) Then 'this handles blank line in the file
If ProjTask.Summary = False Then 'this handles summary tasks which are only allowed to be fixed duration
If ProjTask.ExternalTask = False Then 'this handles external tasks
ProjTask.Date1 = "" 'Clears the field we use to restore original constraint date
ProjTask.Number15 = 0 'Clear the field we use to restore constraint type
'If ProjTask.TaskDependencies.Count > 0 Then 'selects tasks with 1 or more dependencies
ProjTask.Date1 = ProjTask.ConstraintDate 'Stores restore data into fields
ProjTask.Number15 = ProjTask.ConstraintType 'Stores restore data into fields
ProjTask.ConstraintType = 0 'Sets task to as soon as possible
' End If
End If
End If
End If
Next ProjTask
End Sub
Macro to Restore constraints removed by 'Remove all constraints'
'Macro to Restore all contraints that were erased by any remove constraints macro
'This sets resets the tasks to have their original constraint types and dates
'Tamzin Morphy (https://www.stakeholdermap.com/ms-project/ms-project-vba.html) - Tweak to Restore_NonLogic_Constraints by Jack Dahlgren 4/17/00 - restore all constraints
'Copyright T Morphy 29/07/2014
Sub Restore_All_Contraints()
Dim ProjTasks As Tasks
Dim ProjTask As Task
Dim TaskDeps As TaskDependencies
If MsgBox("This Macro will restore All Constraints for tasks that have predecessors. Do you want to continue?", vbYesNo) = vbNo Then Exit Sub
Set ProjTasks = ActiveProject.Tasks
For Each ProjTask In ProjTasks 'these if statements step through all tasks in the project
If Not (ProjTask Is Nothing) Then 'this handles blank line in the file
If ProjTask.Summary = False Then 'this handles summary tasks which are only allowed to be fixed duration
If ProjTask.ExternalTask = False Then 'this handles external tasks
'If ProjTask.TaskDependencies.Count > 0 Then 'Selects only tasks with dependencies
ProjTask.ConstraintType = ProjTask.Number15 'restores data from storage fields
ProjTask.ConstraintDate = ProjTask.Date1 'restores data from storage fields
' End If
End If
End If
End If
Next ProjTask
End Sub
Add notes to multiple, selected tasks
This macro adds notes to the Notes of selected tasks. If a task has existing notes it will insert the text at the start of the Notes field. This is useful if you need to add the same note to multiple tasks.
Sub AddNotesToSelectedTasks()
'This macro adds notes to the Notes field of selected tasks
'It is useful if you want to add explanatory notes to certain types or groups of tasks
'It will add text at the start Notes field, before any existing notes.
'Copyright Tamzin Morphy July 2014 https://www.stakeholdermap.com/ms-project/ms-project-vba.html
Dim addnote As String
Dim UpdateTask As Task
If ActiveSelection = 0 Then
MsgBox "Select the tasks that you want to add Notes to"
Exit Sub
End If
addnote = InputBox("Enter text to add to the task notes field - no leading space needed, leave blank to quit")
If addnote = "" Then Exit Sub
For Each UpdateTask In ActiveSelection.Tasks
UpdateTask.Notes = addnote & " " & UpdateTask.Notes
Next UpdateTask
End Sub
Add text to the start of multiple task names
This macro
prefixes text into the Task Name of all selected tasks. It is useful if you are reusing sections of your schedule and want to rename multiple tasks, for example prefixing
a project, sprint or
work package name to selected tasks. Select the tasks you want to update before running the macro.
Sub AddTextAtStartOfTask()
'This macro adds text you enter at the start of the name of all selected tasks
'It is useful if you want to identify certain tasks as being part of a group for example "sprint 2".
'Based on AddMyText by Jack Dahlgren, Feb 2002
'Copyright Tamzin Morphy July 2014 https://www.stakeholdermap.com/ms-project/ms-project-vba.html
Dim addtext As String
Dim UpdateTask As Task
If ActiveSelection = 0 Then
MsgBox "Select the tasks that you want to add text to"
Exit Sub
End If
addtext = InputBox("Enter text to add to the start of the task name - no leading space needed, leave blank to quit")
If addtext = "" Then Exit Sub
For Each UpdateTask In ActiveSelection.Tasks
UpdateTask.Name = addtext & " " & UpdateTask.Name
Next UpdateTask
End Sub
Add text to the end of multiple task names
This macro
appends text you enter onto the name of all selected tasks. It is useful if you are reusing sections of your schedule and want to rename multiple tasks, for example append something like "Phase 2" to selected tasks. Select the tasks you want to update before running the macro.
Sub AppendMyText()
'This macro appends text you enter onto the name of all selected tasks.
'It is useful if you are reusing sections of your schedule and want
'to rename tasks (ie: append something like "Phase 2" to all selected tasks.
'Copyright Jack Dahlgren, Feb 2002
'Tamzin Morphy (https://www.stakeholdermap.com/ms-project/ms-project-vba.html) - added check for selected task and message to select the tasks which will have text appended
Dim newstuff As String
Dim t As Task
Dim s As Tasks
If ActiveSelection = 0 Then
MsgBox "Select the tasks that you want to append text to"
Exit Sub
End If
newstuff = InputBox("Enter text to add the end of the task name - no leading space needed, leave blank to quit")
If newstuff = "" Then Exit Sub
For Each t In ActiveSelection.Tasks
t.Name = t.Name & " " & newstuff
Next t
End Sub
Read more guides on using Microsoft Project
Marmel, E. (2010).
Daley, S. (2013).