2016-04-22 1 views
0

J'essaie d'écrire une macro VBA Excel 2016 qui lira les données d'un projet Microsoft Project 2013 Summary (c'est un projet qui contient tous mes projets actifs) et résumer les données dans une feuille récapitulative dans Excel.Impossible de lire les tâches MS Project 2013 dans Excel 2016 VBA

Voici le code que j'ai jusqu'à présent:

Sub ExtractFromMsProject(ProjectPath As String) 

    Dim ProjectApp As MSProject.Application 
    Dim EachProject As MSProject.Project 
    Dim ProjectFile As MSProject.Project 
    Dim SubProjectFile As MSProject.SubProject 
    Dim SubProjectIndex As Long 

    On Error Resume Next 
    Set ProjectApp = GetObject(, "MSProject.Application") 
    If ProjectApp Is Nothing Then 
    Set ProjectApp = New MSProject.Application 
    End If 
    ProjectApp.DisplayAlerts = False 
    For Each EachProject In ProjectApp.Projects 
    If ProjectPath = EachProject.FullPath Then 
     Set ProjectFile = EachProject 
     Exit For 
    End If 
    Next 
    If ProjectFile Is Nothing Then 
    If ProjectApp.FileOpenEx(Name:=ProjectPath, ReadOnly:=True) Then 
     Set ProjectFile = ProjectApp.ActiveProject 
    Else 
     MsgBox "Unable to open the source project file '" & ProjectPath & "'." 
     Exit Sub 
    End If 
    End If 
    ProjectApp.Visible = True 
    For Each SubProjectFile In ProjectFile.Subprojects 

    Next 
' For SubProjectIndex = 0 To ProjectFile.Subprojects.Count - 1 
' Set SubProject = ProjectFile.Subprojects(SubProjectIndex) 
' Next 

    ProjectApp.FileCloseEx pjDoNotSave 
    ProjectApp.Quit 

End Sub 

Il fonctionne très bien jusqu'à ce que je à:

For SubProjectIndex = 0 To ProjectFile.Subprojects.Count - 1 

A cette ligne, je reçois un message d'erreur:

"Erreur d'automatisation: bibliothèque non enregistrée"

J'ai essayé de faire des recherches sur Google, mais tout ce que j'ai trouvé est pour une ancienne version de Office/Project.

Toute aide serait grandement appréciée.

+0

Vous avez déclaré SubProject en tant qu'objet Task, et non en tant qu'objet SubProject. En outre, SubProject est un mot-clé; choisissez un non-mot-clé pour vos noms de variables. Cela dit, essayez 'For Each SubProj dans ProjectFile.SubProjects'. –

+0

J'ai corrigé la déclaration de SubProject d'un objet Task à un objet SubProject ainsi que la mise à jour du nom de la variable SubProject à SubProjectFile selon votre suggestion et je reçois toujours la même erreur. D'autres idées? – Kyle

+0

Jetez un oeil à cette page, il semble être pertinent: [Suppression des références périmées au projet ...] (http://kb.palisade.com/index.php?pg=kb.page&id=1418) –

Répondre

0

Subproject a été un type pendant un certain temps. C'est un membre des sous-projets. Vous ne pouvez donc pas parcourir la collection Sous-projets avec un objet de tâche.

Je me serais attendu à une erreur de type ou un problème avec l'objet étant réglé sur "Aucun". Cette combinaison avec le message d'erreur que vous obtenez me fait penser que vous pouvez avoir une ancienne version de la bibliothèque MS Project référencée par votre environnement VBA. Sous Outils> Références, vous avez besoin de la "Bibliothèque d'objets Microsoft Project 15.0".

Une autre chose. Les tâches du projet récapitulatif sont les tâches récapitulatives de projet insérées. Je n'ai jamais été capable de parcourir toutes les tâches en essayant de parcourir les tâches du projet sommaire à moins que les sous-projets ne soient dissociés de leur source (LinkedToSource = False). En fonction de ce que vous faites, il peut être tout aussi efficace d'itérer à travers un File System Object pour le dossier, ouvrir chaque projet, extraire vos données, ensuite ... Pour ce faire, vous devrez également inclure le Microsoft Scripting Runtime dans les références.

Espérons que ça aide. Si cela répond à la question, signalez-le en tant que tel.

+0

J'ai mis à jour la déclaration de SubProject comme une tâche à un sous-projet par votre suggestion et je peux confirmer que j'ai "Microsoft Project 15.0 Object Library" référencé. Mais je reçois toujours la même erreur. D'autres suggestions? – Kyle