Lorsque vous définissez un champ personnalisé d’entreprise, s’il est de type numérique, vous avez la possibilité de faire en sorte que la somme soit calculée au niveau de la tâche récapitulative.

La somme est alors correctement calculée lorsque les tâches récapitulatives et sous-tâches appartiennent au même projet. Mais est-ce que cela est le cas lorsque les tâches récapitulatives sont des sous-projets insérés dans un projet maître?

En fait, cela ne fonctionne pas par défaut et les champs personnalisés d’entreprise censés calculer et retourner la somme de ces champs sur les sous-tâches renvoient tout simplement #ERROR.

clip_image001

Même si cela peut sembler étrange de prime abord, il s’agit d’un fonctionnement normal du produit. En effet, pour que la somme d’un champ soit calculée, il faut que les valeurs correspondantes aux sous-projets soient chargées en mémoire. Or, ce n’est pas le cas lorsque l’on ouvre un projet maître, dans lequel tous les sous-projets sont fermés par défaut.

Pour bien comprendre le phénomène, voici ce qu’il se passe en mémoire à chaque étape de l’ouverture :

1. Ouverture du projet maître dans Project :

clip_image003 

Voici la quantité de mémoire utilisée par le processus WINPROJ.EXE (Project):

clip_image005

2. Affichage du détail du sous-projet 1 :

clip_image007

On note une sensible augmentation de la quantité de mémoire utilisée par le processus WINPROJ, ce qui indique que de nouvelles données ont été chargées.

clip_image009

3. Affichage du détail du sous-projet 2:

clip_image011

La quantité de mémoire utilisée par le processus WINPROJ a encore augmentée. On note maintenant que la somme des champs d’entreprise est complète (sous-projets 1 et 2):

clip_image013

En définitive, pour avoir le total d’un champ d’entreprise lorsque le projet contient des sous-projets, il faut afficher le détail de chaque sous-projet afin d’en charger le contenu en mémoire:

clip_image002

On peut alors imaginer une solution pour automatiser le chargement des sous-projets lors de l’ouverture du projet maître, sans troubler l’utilisateur en affichant et cachant les sous-tâches.

Pour cela, il faut envisager de passer par une procédure VBA (Visual Basic for Applications) basée sur le modèle objet de Project.

Voici un exemple de code VBA, basé sur l’évènement Open d’un projet :

Private Sub Project_Open(ByVal pj As Project)

If ActiveProject.Type = 2 Then

    If ActiveProject.Subprojects.Count > 0 Then

        CurView = ActiveProject.CurrentView

        Application.ScreenUpdating = False

        ActiveProject.Views(“Gantt Chart”).Apply

        SelectTaskColumn Column:="Name"

        OutlineShowAllTasks

        OutlineHideSubTasks

        OutlineShowAllTasks

        OutlineHideSubTasks

        OutlineShowSubTasks

        Application.ViewApply CurView

    End If

FileCloseEx pjDoNotSave, False, True

End If

Application.ScreenUpdating = True

End Sub

Pour l’intégrer dans votre solution EPM, vous devez l’ajouter dans l’Entreprise Global afin qu’il soit disponible pour chaque utilisateur de Projet:

Pour ce faire, vous devez ouvrir l’Entreprise Global à partir de Project, aller dans le Visual Basic Editor, et ajouter la procédure comme ceci:

clip_image001[5]

Puis vous sauvegardez l’Entreprise Global, et vous redémarrez Project.

Cette solution va, à chaque ouverture de projet contenant des sous-projets, les ouvrir et revenir à l’affichage de départ. Ainsi, l’utilisateur ne se rend compte de rien si ce n’est que la somme des champs d’entreprise est calculée.

J’attire cependant votre attention sur un point important: Il n’est pas possible de fermer les sous-projets indépendamment du projet maître. Cela veut donc dire que tant que le projet maître est ouvert, les sous-projets qui le composent le sont aussi. Il n’est donc pas possible pour un autre utilisateur de les ouvrir et de travailler dessus.

Bien entendu, vos commentaires et suggestions sont les bienvenus.

Bonne journée

Marc Biarnès