Blogs

Créer un Event Handler dans Project Professional

  • Comments 1
  • Likes

Bonjour,

Recevant régulièrement des demandes pour effectuer des tâches basées sur des évènements dans Project Professional, telle qu’afficher un message lorsqu’une tâche est supprimée, je vous propose un article qui vous permettra de réaliser cela.

Tout d’abord, il faut savoir que le modèle objet VBA de Project Professional propose un certain nombre d’évènements sur lesquels il est possible de déclencher une action.

Par exemple, si vous désirez déclencher une action sur un évènement associé au projet, vous avez accès à ces évènements par défaut :

image

Dans l’Explorateur d’Objets VBA, les évènements associés à des objets ou des collections d’objets sont représentés par un petit éclair :

image

Si vous programmez sous Project Server, vous connaissez certainement les Event Handlers qui vous permettent d’associer des actions à des évènements proposés en standard dans le modèle objet de PSI (ou PFDS pour les plus anciens) Cette solution existe aussi dans Project Professional et c’est cela que je veux vous montrer à travers un exemple concret.

La problématique est la suivante: Comment afficher un message qui interdit la suppression d’une tâche lorsque celle-ci possède une Planification Initiale (Baseline)?

Tout d’abord, il est utile de préciser que les évènements disponibles appartiennent à la classe Application. Pour les visualiser, le plus simple est d’utiliser l’Explorateur d’Objets VBA et de sélectionner la classe Application:

image

Dans mon exemple, le code que je souhaite ajouté doit se déclencher avant que la tâche ne soit supprimée. Je vais donc utiliser l’évènement ProjectBeforeTaskChange.

Je vais donc commencer par créer mon Module de Classe. Pour cela, j’ajoute mon Module de Classe dans mon projet :

image

Dans les propriétés de ce module, je change le nom (“Class1”) par un nom plus explicite tel que EventClassDeleteTask :

image

Puis, j’ajoute le code suivant :

image

Ce qu’il faut absolument retenir est que le Module de Classe doit absolument être construit de cette manière:

Public WithEvents App As Application
Public WithEvents Proj As Project

Private Sub App_event

 Votre code

End Sub

Une fois le Module de Classe est créé et que vous avez testé le code, il faut qu’il soit initialiser à l’ouverture du projet. Pour cela, il suffit d’utiliser l'évènement Open de l’objet Project de la manière suivante :

1. Dans le panneau de gauche, double-cliquez sur ThisProject
2. Insérez le code d’initialisation du Module de Classe :

image

Il vous suffit ensuite de sauvegarder le projet, de le fermer puis de le rouvrir pour que le code soit effectif.

Tout ceci peut bien sûr se faire dans l’Enterprise Global Template, si vous souhaitez que tous les utilisateurs aient accès à votre code. La procédure à suivre est exactement la même excepté que vous devez ouvrir l’Enterprise Global en lecture-écriture dans Project Professional avant d’y insérer votre code.

Pour de plus amples informations sur la programmation dans Project et Project Server, je vous conseille la documentation des différents Kit de Développement disponibles sur le site MSDN:

N’hésitez à commenter cet article et à partager vos expériences.

Bonne journée,

Marc Biarnès

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • <p>Merci Marc</p> <p>Pour aller au bout de cette logique, on peut aussi verrouiller ce type d&#39;évènements:</p> <p>Projectbeforeresourcedelete</p> <p>ProjectBeforeTaskDelete</p> <p>pour l&#39;ensemble du Baseline work de 1 à 10.</p> <p>Il peut être aussi utile de verrouiller l&#39;édition manuelle de ces champs en créant un event Handler sur ce type d&#39;évènements:</p> <p>ProjectBeforeTaskChange</p> <p>ProjectBeforeAssignmentChange</p> <p>ProjectBeforeResourceChange</p> <p>Avec un test du type: If Field = PjField.pjResourceBaselineWork Then</p> <p>MsgBox (&quot;Cannot change baseline work &quot;&quot;&quot; &amp; res.Name &amp; &quot;&quot;&quot; because of work on&quot; &amp; WorkOnBaseline)</p>