Importer Project à partir d'Excel en VBA

Le
Fdecourt
Bonjour,

J'ai un fichier Project dans lequel je saisie l'ensemble des
informations concernant le projet.
J'ai un fichier Excel dans lequelle, jusqu'à aujourd'hui je copie les
taches de mon Project, et les colle dans Excel pour réaliser ensuite
automatique tout un tas d'indicateurs.

Pour éviter les erreurs de manipulation, je souhaiterai pouvoir
importer dans mon Excel, à partir d'Excel, toutes les lignes de mon
project, et pour chaque ligne, n'importer que les colonnes qui sont
visibles.

Je n'ai pas de problème pour l'ouverture du projet à la lecture taches
par taches.
Par contre, comment savoir quelle colonne est visible ou non ?, et
comment récupérer pour chacune de ces colonnes, leur contenu par
ligne.

Je pourrais passer par la lecture des attributs de chaque tachen mais
cela rendrait mon système hyper rigide.

Merci pour votre aide

Cordialement,

F.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gérard Ducouret
Le #21386341
Bonjour,

Vous pouvez effectivement échanger des données entre Project et Excel (dans
les deux sens) via un mappage : corespondance colonne à colonne.
Cette manip peut facilement s'automatiser par une procedure VBA d'autant
plus facile à écrire q'elle peut s'écrire en mode auto-apprentissage.
Pour créer un mamppage (à l'exportation, mais il fonctionnera aussi à
l'importation):
Dans Project:
Fichier / Enregistrer sous... / Type de fichier : Classeur Microsoft Excel.
Ensuite il n'y a plus qu'à se laisser conduire par l'assistant
--
Gérard Ducouret

[Project MVP], Certifié Project 70632, Certifié ITIL
www.pragmasoft.fr
Un livre sur Project Server 2007 pour le Chef de projet:
http://www.lmet.fr/advsearch.cgi?_EXPRESSION=ducouret&_DISTANCE&_PAGE=1


"Fdecourt"
Bonjour,

J'ai un fichier Project dans lequel je saisie l'ensemble des
informations concernant le projet.
J'ai un fichier Excel dans lequelle, jusqu'à aujourd'hui je copie les
taches de mon Project, et les colle dans Excel pour réaliser ensuite
automatique tout un tas d'indicateurs.

Pour éviter les erreurs de manipulation, je souhaiterai pouvoir
importer dans mon Excel, à partir d'Excel, toutes les lignes de mon
project, et pour chaque ligne, n'importer que les colonnes qui sont
visibles.

Je n'ai pas de problème pour l'ouverture du projet à la lecture taches
par taches.
Par contre, comment savoir quelle colonne est visible ou non ?, et
comment récupérer pour chacune de ces colonnes, leur contenu par
ligne.

Je pourrais passer par la lecture des attributs de chaque tachen mais
cela rendrait mon système hyper rigide.

Merci pour votre aide

Cordialement,

F.
Gérard Ducouret
Le #21386431
Lors de l'importation des données Excel vers Project, il faudra demander une
"fusion" avec comme clé de fusion le champ "N° Unique" que vous aurez bien
soin d'inclure dans votre mappage lors de l'exportation.
Fdecourt
Le #21386661
Merci Gérard pour ta réponse.

Cependant je souhaite passer par une version 100% macro.
Mon fichier Excel contient déjà pas mal de formules et de macros qui à
partir d'une feuille dans laquelle je colle mon planning (ctrl + a
puis ctrl + C sous project, que je colle au format texte à un endroit
précis de ma feuille) me calcul et me créer un tas de graphiques et
d'indicateurs, pour ensuite créer une présentation PowerPoint.
Tout fonctionne très bien, mais je voudrais éviter d'avoir à faire la
copie puis le collage dans Excel, en automatisant tout.

Malheureusement, sur mon poste, je n'ai pas accès à l'aide d'Office.

Donc je voudrais une boucle de ce genre (celle-ce ne fonctionne
absolument pas, c'est pour illustrer ce que je souhaiterai) :
For Each t In ActiveProject.Tasks
For Each tf In t.Fields
If tf.Visible = True Then
ReDim Preserve tmp(0 To 100, 0 To y)
tmp(x, y) = Tasks(t).Fields(tf).Value
x = x + 1
End If
Next
y = y + 1
Next

Ou Fields, qui en l'occurence ne correspond pas à ce que je souhaite,
est une colonne de projet.

puis je n'ai plus qu'à coller mon tableau tmp la ou je le souhaite
dans Excel

Ceci me permet de n'avoir qu'un bouton dans Excel pour créer
l'ensemble de mes indicateurs, ce qui m'arrangera car cela éviterait
les erreurs de manipulations

Merci pour votre aide

Cordialement,

F.
Gérard Ducouret
Le #21386931
Si vous savez quels champs vous voulez exporter vers Excel, pourquoi ne pas
les référencer par leur nom plutot que par le fait qu'ils sont affichés ou
pas ?
--
Gérard Ducouret

[Project MVP], Certifié Project 70632, Certifié ITIL
www.pragmasoft.fr
Un livre sur Project Server 2007 pour le Chef de projet:
http://www.lmet.fr/advsearch.cgi?_EXPRESSION=ducouret&_DISTANCE&_PAGE=1

"Fdecourt"
Merci Gérard pour ta réponse.

Cependant je souhaite passer par une version 100% macro.
Mon fichier Excel contient déjà pas mal de formules et de macros qui à
partir d'une feuille dans laquelle je colle mon planning (ctrl + a
puis ctrl + C sous project, que je colle au format texte à un endroit
précis de ma feuille) me calcul et me créer un tas de graphiques et
d'indicateurs, pour ensuite créer une présentation PowerPoint.
Tout fonctionne très bien, mais je voudrais éviter d'avoir à faire la
copie puis le collage dans Excel, en automatisant tout.

Malheureusement, sur mon poste, je n'ai pas accès à l'aide d'Office.

Donc je voudrais une boucle de ce genre (celle-ce ne fonctionne
absolument pas, c'est pour illustrer ce que je souhaiterai) :
For Each t In ActiveProject.Tasks
For Each tf In t.Fields
If tf.Visible = True Then
ReDim Preserve tmp(0 To 100, 0 To y)
tmp(x, y) = Tasks(t).Fields(tf).Value
x = x + 1
End If
Next
y = y + 1
Next

Ou Fields, qui en l'occurence ne correspond pas à ce que je souhaite,
est une colonne de projet.

puis je n'ai plus qu'à coller mon tableau tmp la ou je le souhaite
dans Excel

Ceci me permet de n'avoir qu'un bouton dans Excel pour créer
l'ensemble de mes indicateurs, ce qui m'arrangera car cela éviterait
les erreurs de manipulations

Merci pour votre aide

Cordialement,

F.
Fdecourt
Le #21387371
Parceque je veux pouvoir autoriser les utilisateurs à ajouter des
champs à leur convenance, sans avior à modifier le code à chaque fois .

J'ai une macro qui fonctionne avec la liste des champs, mais je
voudrais me débarrasser de cette contrainte :

Dim prjApp As MSProject.Application
Dim k As Integer, lgn As Integer, col As Integer
Set prjApp = CreateObject("MsProject.Application")
Dim monProjet()
prjApp.FileOpen ThisWorkbook.Path & "DEP - Planning détaillé ECM
- V1.2.mpp", ReadOnly:=True
Dim tmp()
tmp = Array(188743703, 188743765, 188743694, 188743709, 188743715,
188743716, 188743708, 188743721, 188743722, 188743699, 188743712,
188743752, 188743767, 188743768, 188743769, 188743729, 188743731,
188743753, 188743754, 188743755, 188743727)
For Each t In prjApp.Projects(1).Tasks
ReDim Preserve monProjet(0 To 20, 0 To k)
For x = 0 To UBound(tmp)
monProjet(x, k) = t.GetField(tmp(x))
Next
k = k + 1
Next
lgn = 2
col = 6
With Feuil1
.Range(.Cells(lgn, col), .Cells(.Cells(65536,
col).End(xlUp).Row, .Cells(lgn,
256).End(xlToLeft).Column)).ClearContents
.Range(.Cells(lgn, col), .Cells(UBound(monProjet, 2) + lgn,
UBound(monProjet, 1) + col)).Value = Application.Transpose(monProjet)
End With
Gérard Ducouret
Le #21390621
Bonjour,

Voici une macro (due à Jan de Messmaeker ) qui liste tous les champs de la
table active:
Sub Fieldlist()
Dim TB As Table
Dim CTR As Integer
For Each TB In ActiveProject.TaskTables
If TB.Name = ActiveProject.CurrentTable Then
Exit For
End If
Next
For CTR = 1 To TB.TableFields.Count
Debug.Print FieldConstantToFieldName(TB.TableFields(CTR).Field)
Next CTR
End Sub

--
Gérard Ducouret

[Project MVP], Certifié Project 70632, Certifié ITIL
www.pragmasoft.fr
Un livre sur Project Server 2007 pour le Chef de projet:
http://www.lmet.fr/advsearch.cgi?_EXPRESSION=ducouret&_DISTANCE&_PAGE=1

"Fdecourt"
Parceque je veux pouvoir autoriser les utilisateurs à ajouter des
champs à leur convenance, sans avior à modifier le code à chaque fois.

J'ai une macro qui fonctionne avec la liste des champs, mais je
voudrais me débarrasser de cette contrainte :

Dim prjApp As MSProject.Application
Dim k As Integer, lgn As Integer, col As Integer
Set prjApp = CreateObject("MsProject.Application")
Dim monProjet()
prjApp.FileOpen ThisWorkbook.Path & "DEP - Planning détaillé ECM
- V1.2.mpp", ReadOnly:=True
Dim tmp()
tmp = Array(188743703, 188743765, 188743694, 188743709, 188743715,
188743716, 188743708, 188743721, 188743722, 188743699, 188743712,
188743752, 188743767, 188743768, 188743769, 188743729, 188743731,
188743753, 188743754, 188743755, 188743727)
For Each t In prjApp.Projects(1).Tasks
ReDim Preserve monProjet(0 To 20, 0 To k)
For x = 0 To UBound(tmp)
monProjet(x, k) = t.GetField(tmp(x))
Next
k = k + 1
Next
lgn = 2
col = 6
With Feuil1
.Range(.Cells(lgn, col), .Cells(.Cells(65536,
col).End(xlUp).Row, .Cells(lgn,
256).End(xlToLeft).Column)).ClearContents
.Range(.Cells(lgn, col), .Cells(UBound(monProjet, 2) + lgn,
UBound(monProjet, 1) + col)).Value = Application.Transpose(monProjet)
End With
Publicité
Poster une réponse
Anonyme