La somme de champs personnalisés renvoie #ERROR sur la tâche récapitulative d’un projet maître
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.
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 :
Voici la quantité de mémoire utilisée par le processus WINPROJ.EXE (Project):
2. Affichage du détail du sous-projet 1 :
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.
3. Affichage du détail du sous-projet 2:
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):
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:
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:
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