mardi 8 juin 2010

Faire du VBA dans MS Project Pro 2010

Comme informé dans mon poste précédent (ici) je vais vous expliquer la macro VBA me permettant de calculer le temps réellement consommé pour une tâches ou l'ensemble des tâches sur un période données.

Bien qu’aujourd’hui des langages de programme bien plus puissant existent (VB.Net, C# …), le VBA garde un esprit d’utilisateur plus fonctionnel, et reste pratique vue qu’il ne nécessite aucun autre logiciel, ni de grande connaissance en programmation.

Donc pour tout ceux qui vont lire ces lignes et qui partent avec un apriori sur le VBA, garder à l’esprit que ce langage offre de la simplicité à des non développeur.

Qu'est ce que le VBA ?

Petit rappel pour les personnes ayant pas ou peu de connaissance sur VBA.  Visual Basic for Applications est née dans les années 90 avec l’arrivée des langages de programmation VB. VBA est un langage simple, mais riche et relativement flexible dans son implémentation. Sa ressemblance avec VB est plus visuel que réel. Effectivement VBA à par exemple une gestion des erreurs par handler et VB par exception.

Exemple VBA

' Gestion des erreurs sur la nom sélection d'une tâche
On Error GoTo Err_Tache

Le VBA se repose sur une application hôte par exemple (Excel, Word…) dans notre cas et dans celui de l’article nous verrons VBA pour MS Project Pro 2010.
Le modèle Objet, donc les éléments qui est possible d’utiliser, est propre à l’application hôte par exemple dans Excel nous pourrions utiliser les objets de type “Workbook” qui est un classeur Excel ou encore “Sheet” qui est une feuille Excel, si nous souhaitons récupérer une valeur de cellule d’une feuille nous pourrions écrire cela :

Exemple VBA

Workbooks("GestionIncident").Sheets("ProjetA").Range("B2")

Pour MS Project 2010 il y a aussi des objets propres à l’application, par exemple pour récupérer la tâche actuellement sélectionnée nous pouvons utiliser la ligne suivante:

Exemple VBA

ActiveSelection.Tasks.Application.ActiveCell.Task

Comment avoir accès au VBA dans MS Project 2010 ?

Ouvrez MS Project 2010 puis allez dans “Fichier” –> “Options” –> “Personnaliser le Ruban”, dans la colonne de droite cochez “Développeur”

Dans cette fenêtre il est possible de rendre visible ou nom des onglets.

image

Une fois l’onglet “Développeur” affiché, vous pouvez soit créer une macro, soit faire directement du VBA. Nous allons créer une macro directement dans Visual Basic, Cliquez sur “Visual Basic”

image

Présentation de l’interface graphique

Dans la fenêtre de Visual Basic pour applications vous avez trois emplacements:

  • Ensemble du projet, cette espace vous permet de naviguer entre les pages de MS Project, les Feuilles ou Formulaires et les Modules.

image

  • L’espace “Propriété” ceci vous permettra entre autre de donner des identifiants aux composants graphique telle que les boutons par exemple:

image

  • L’espace code ou graphique, il vous permettra soit de créer votre formulaire graphique, soit de taper votre code VBA :

image

Création de notre macro

Nous allons commencer par créer une variable pour stocker le choix de la période de calcule. Pour ce faire, faire un clique droit sur le répertoire “Module” puis “Insertion” puis “Module”. Renommez la en “Variables”.

Dans ce modules ajouter une variable “public” nommée “ChoixCalcul” de type “String”. “Public” signifie que cette variable pourra être accessible depuis n’importe où. Une variable est un élément dans le quel nous pouvons stocker de l’information. Enfin le type “String” signifie que les éléments qui seront dans cette variable seront un ensemble de caractères.

Maintenant nous allons créer une fenêtre pour demander la période sur la quelle le calcul va se faire.

Faire un clique droit sur le répertoire “Feuille” puis “Insertion” puis “UserForm

image

Créez le formulaire comme suite :

image

Pour chaque radio bouton mettez “Option” dans la propriété “GroupeName”, ceci aura pour effet de désélectionner le radio bouton au clique sur un autre.

Double cliquez sur le bouton “Valider” afin d’arrivé sur le code qui sera utilisé lors du clique sur celui-ci. Dans la partie code nous allons tester quelle option est sélectionnée et nous donnerons la valeur à notre variable précédemment créés.

Private Sub CommandButton1_Click()
    If OptionButton1.Value = True Then
        Variable.ChoixCalcul = "jour"
    ElseIf OptionButton4.Value = True Then
       Variable.ChoixCalcul = "mois"
    ElseIf OptionButton3.Value = True Then
        Variable.ChoixCalcul = "semaine"
    ElseIf OptionButton5.Value = True Then
        Variable.ChoixCalcul = "moisAvant"
    Else
        Variable.ChoixCalcul = "Neant"
    End If
    Unload CalculOption
End Sub

Double cliquez sur le bouton “Fermer” afin de fermer notre formulaire et insérer le code suivant.

Private Sub CommandButton2_Click()
    Unload CalculOption
End Sub

Maintenant nous allons créer le code principale qui permet le calcule.

Création du code principale

Pour ce faire faire un clique droit sur le répertoire “Module” puis “Insertion” puis “Module”. Renommez la en “CalculHours”.

Créer une méthode “CalculCumulTravailReel” de la façon suivante :

Public Sub CalculCumulTravailReel()

End Sub

A l’intérieur de cette méthode nous allons créer les variables que nous allons utiliser dans l’ensemble de cette méthode.

' Déclaration des variables
   Dim TSV As TimeScaleValue
   Dim TSVs As TimeScaleValues
   Dim Ass As Assignment
   Dim Deb As Date, Fin As Date
   Dim i As Integer
   Dim SumHours As Integer
   Dim choix As String

Le fait de mettre une “’” devant une ligne permet de mettre cette ligne en commentaire, ceci pour permettre de commenter notre code afin de le rendre compréhensible.

Ensuite nous allons appeler notre formulaire pour le choix de la période:

' Ouverture de la fenêtre de choix de temps
    CalculOption.Show
    choix = Variable.ChoixCalcul

Maintenant nous allons faire une boucle sur l’ensemble des ressources assignés à la tâche sélectionnée, avec For Each nous allons récupérer toutes les ressources une par une.

' Parcour l'ensemble des personnes assignées
For Each Ass In ActiveSelection.Tasks.Application.ActiveCell.Task.Assignments
       i = i + 1

L’instruction ActiveSelection.Tasks.Application.ActiveCell.Task permet de récupérer la tache de la cellule sélectionnée.

Ensuite nous allons définir la date de début et la date de fin de la période par rapport au choix fait dans le formulaire.

        ' Récupére le choix de l'échelle de temps
        '
        ' NB : Plusieurs façon existe pour ce code, celle - ci
        '      n'est pas la plus jolie, mais la plus simple à
        '      comprendre
        If choix = "jour" Then
            Deb = DateValue(Now)
            Fin = DateValue(Now)
        ElseIf choix = "semaine" Then
            Deb = Date - DatePart("w", Date, vbMonday, vbFirstFourDays) + 1
            Fin = Deb + 6
        ElseIf choix = "mois" Then
            Deb = DateSerial(Year(Date), Month(Date), 1)
            Fin = DateSerial(Year(Date), Month(Date) + 1, 1) - 1
        ElseIf choix = "moisAvant" Then
            Deb = CDate("1/" & Format(DateAdd("m", -1, Date), "mm/yyyy"))
            Fin = DateAdd("d", -1, CDate("1/" & Format(Date, "mm/yyyy")))
        End If

Certain objet de MS Project VBA nous permettent de travailler avec les données, pour la récupération des heures nous utiliserons la commande suivante :

' Récupération des élements pour la période donnée
        Set TSVs = ActiveSelection.Tasks.Application.ActiveCell.Task.Assignments(i).TimeScaleData(Deb, Fin, Type:=pjAssignmentTimescaledActualWork, TimeScaleUnit:=pjTimescaleDays, Count:=1)

Le type “pjAssignmentTimescaledActualWork” permet de récupérer les heures (minutes) passé par ressource.

Plus d’information ici pour plus de détails sur le type qu’il est possible de passer en paramètre.

Ensuite pour avoir la sommes il suffit d’additionner les valeurs récupérées :

' Parcour des éléments pour additionner les temps
' trouvés précédement.
' ATTENTION : Les temps récupérés sont en minutes
For Each TSV In TSVs
           SumHours = SumHours + Val(TSV.Value) / 60
Next TSV

Pour finir il suffit de l’afficher dans un fenêtre de dialogue.

' Affichage des informations
   MsgBox SumHours & "h réellement passée(s) sur l'ensemble la tâche '" & ActiveSelection.Tasks.Application.ActiveCell.Task.Name & "'" & Chr(13) & "Sur la durée du " & Deb & " au " & Fin, vbOKOnly + vbExclamation + R_TO_L, Title:=Application.Name

Bon développement à tous !!!

lundi 7 juin 2010

Personalisation du ruban de MS Project Pro 2010

Personne n'est sans savoir que la version MS Project Pro 2010 offre enfin le ruban à ses utilisateurs. Cette amélioration esthéque mais aussi très fonctionnelle permet un gain de rapidité d'utilisation après biensur une certaine habitude :)

Comment toutes autres applications Office 2010, le ruban est personnalisable dans son ensemble mais un peu plus limitée que pour Excel par exemple pour le quel nous pouvons utiliser CustomUIEditor .

Mise à part ce petit manque, MS Project Pro 2010 offre beaucoup de choses sans être développeur.

Dans cette article je vous propose de créer un nouvel onglet dans le quel nous allons rajouter

  • Un bouton permettant d'exécuter une macro
  • Un ensemble de bouton pour éviter la navigation multiple sur les actions courantes

Première étape ajout de l'onglet "Développeur" pour permette la création de notre macro VBA :

Fichier -> Option -> Personnaliser le Ruban


Création de la macro, cette macro permet de calculer le temps réel pour une tâche sélectionnée et pour une durée donnée (Jour en cours, Semaine en cours, Mois en cours, Mois précédent). Un prochain poste détaillera cette macro VBA.

Onglet "Développeur" -> Visual Basic





Création d'un nouveau onglet :

Fichier -> Option -> Personnalisation du Ruban -> Nouveau Onglet

Puis il faut ajouter un nouvel groupe qui permet de regrouper un ensemble de commandes :

Dans la fenêtre de personnalisation du ruban cliquer sur "Nouveau groupe".

Chaque onglet et chaque groupe peu être renommé et une icone peut être rajouté :



Ensuite vous pouvez sélectionner l'ensemble des boutons dans la liste de gauche pour les ajouter à votre nouvel onglet comme le montre l'image suivante :


Pour mieux comprendre voici une vidéo :


mardi 1 juin 2010

A voir et à revoir