2016-04-14 1 views
1

Dans MS Project, je gère différents niveaux de tâches et de sous-tâches. Comme j'ai une longue liste, je serais en mesure de configurer un identifiant unique personnalisé pour chacun d'entre eux en fonction de leurs tâches parentales et la tâche des grands-parents.MS Project - Code VBA ou fonction de champ personnalisé pour configurer le numéro de référence des tâches présonalisées

Mes niveaux hiérarchiques sont:

  • Lot (LO)
    • phase (PH)
      • Catégorie (CA)
        • chapitre (CH)
          • Livraison (DE)
            • tâches (TA)

A la fin, je voudrais avoir une référence dans chaque ligne telle que: LO1.PH01.CA01. CH01.DE01.TA01 (pour la première tâche dans le premier Livrable dans le premier chapitre .... et ainsi de suite La deuxième tâche dans le même livrable doit être: LO1.PH01.CA1.CH1.DE1.TA2 La ligne du niveau des parents el (Livrable) devrait ressembler à: LO1.PH01.CA01.CH01.DE01.TAOO car certains livrables n'ont pas encore de tâches assignées.

Y aurait-il un moyen automatisé (code VBA ou fonction de champ personnalisé) pour déterminer cette référence et aussi pour vérifier qu'elle est vraiment unique?

Merci beaucoup d'avance pour toute aide à ce sujet!

Cordialement,

Fabien PS: Les niveaux hiérarchiques fournis par MSP ne sont pas toujours alignées entre chaque niveau « Lot », comme dans certains « Lot » Je n'ai pas la catégorie « CA ». En d'autres termes, le livrable n'est pas toujours au niveau hiérarchique 5.

+0

En fait, ceci peut être réalisé en définissant le code WBS dans MS Project et en l'utilisant. – INOPIAE

Répondre

0

Vous avez besoin d'une fonction récursive qui accepte un objet Tâche et un identificateur de chaîne. Étant donné que vous ne voulez pas mettre à jour la propriété name de la tâche, j'utiliserais la propriété Notes pour stocker l'identifiant.

Option Explicit 
Public Sub RecurseStart() 

Dim taskeach As Task 
Dim lngcount As Long 

For Each taskeach In ThisProject.Tasks 
    lngcount = lngcount + 1 
    If taskeach.OutlineLevel = 1 Then 
     TaskID taskeach, Right(taskeach.Name, 2) & lngcount 
    End If 
Next taskeach 

End Sub 

Public Sub TaskID(sometask As Task, someid As String) 

Dim subtask As Task 
Dim lngcount As Long 
Dim someotherid As String 

For Each subtask In sometask.OutlineChildren 
    someotherid = someid & "." 
    lngcount = lngcount + 1 
    someotherid = someotherid & Right(subtask.Name, 2) & lngcount 
    If subtask.OutlineChildren.Count <> 0 Then 
     TaskID subtask, someotherid 
    End If 
    subtask.Notes = someotherid 
    someotherid = someid 
Next 
End Sub 
+0

En note, j'ai enlevé les parenthèses de votre exemple, seulement eu le code de deux lettres comme chaîne de texte extrême droite – cronos2546