By Jan De Messemaeker, Microsoft Project Most Valuable Professional
The author runs Prom+ade BVBA . He is a consultant on Project Management, specifically on the role of Microsoft Project in these methods. The article below is a response to a question Jan has been hearing with nearly all his customers, and it offers a complete solution to the dilemma.
A frequently asked question about “best practices” in Microsoft Project usage is about the use of unmovable tasks to represent non productive activities rather than their introduction into the resource calendar as non working days. Whereas the latter seems the most natural, and certainly the simplest as non-working days are immediately taken into account by the calculation - it has a few drawbacks:
Using immovable tasks to represent non-working days will solve both these problems, as is explained below. Moreover, it will provide a visual “Gantt Chart” representation of holidays. However, many project managers have already been introducing non-working time in the resources’ calendar. This means that migrating to this alternative representation can imply quite some work, which as such has only little added value for the project manager himself.
The VBA macro presented here will perform this migration automatically, creating these immovable tasks tasks and eliminating non-working days from existing calendars.
Obviously, representing non-working time as tasks will solve the reporting problem as a fully allocated resource will show a 100% occupation in any Usage report when his absences are counted as worked time. However, with “normal” scheduling the method will cause two distortions in the plan: the cost of the non-working time will be allocated to the project, and work on “real” tasks happily goes on during these absences.
The cost problem can be avoided in two ways. Either you create for each resource a cost rate table with zero cost, and assign this table to each non-working assignment or (which is the solution presented in the macro attached) you put the non-working tasks in a separate project such that they do not influence the cost of your original project.
As for the scheduling problem, there is Resource Leveling. This highly underestimated feature of Microsoft Project, solves our problem as:

Convinced about the goodies of this method? If your project already exist, and you want to replace calendar non-working time by fixed task (“Must Start On” constrained) you are faced with a tedious task. I want to alleviate this for you by supplying a free macro that does the trick.
Here’s the code:
To install the macro:
You will be requested to enter a date. Non Working days before that date will not be converted into NWT tasks.
At the end of the run you will find three open projects:
Jack Dahlgren, another Project MVP, has many more interesting Macros on his site:
Jack Dahlgren's Microsoft Project Tools and Tips
Do not hesitate to mail for more information on this macro, Resource Levelling, or other Microsoft Project related questions!