Se connecter avec
S'enregistrer | Connectez-vous

Export en VBA de MSProject sous Excel

Dernière réponse : dans Programmation

Bonjour à tous.
J'aimerai réaliser une macro sous MSProject qui une fois lancée exporte le fichier sous excel (ça c'est bon :)  ) mais egalement qui copie le contenu de l'export dans une nouvelle feuille d'une page excel déja rédigée ( je ne sais pas si je suis assez clair...)
Voici le code que j'ai rédigé mais il ne marche pas (le debugger m'indique une erreur d'objet)

  1. Sub export_j()
  2.  
  3. FileSaveAs Name:="D:\blablabla\data.xls", _
  4. FormatID:="MSProject.XLS8", _
  5. map:="mon_mappage"
  6.  
  7. Set ExcelAppli = CreateObject("Excel.application")
  8. Set objFSO = CreateObject("Scripting.FileSystemObject")
  9.  
  10. ExcelAppli.Application.Workbooks.Open "D:\blablabla\data.xls"
  11. ExcelAppli.Application.Workbooks.Open "D:\blablabla\fichier_receveur.xls"
  12. ExcelAppli.Visible = True
  13. ExcelAppli.Application.Workbooks("data.xls").Sheets("feuil1").Select
  14. ExcelAppli.Application.Workbooks("data.xls").Sheets("feuil1").Copy Before=Workbooks("fichier_receveur.xls").Sheets("graph")
  15.  
  16.  
  17.  
  18. End Sub

(Il manque les lignes de code pour sauvegarder et liberer la memoire)Voyez vous là où ça cloche?
Merci d'avance!

Autres pages sur : export vba msproject excel

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Oki pour le FSO parasite. Epure mieux tes extraits, par principe :) 

>>> plus efficace
Non, pas du tout. Le VBA/Excel exécuté par MSProject est rigoureusement celui d'Excel. Pas besoin de te faire des noeuds au cerveau ;) 

Je n'ai pas dit non plus que ce serait moins efficace.

Bon, comme je me fais chier comme un rat mort au boulot, je te le fais. Mais ne le dis pas aux autres membres du forum....
  1. Dim xl As Object
  2. Dim data_wb As Object
  3. Dim recv_wb As Object
  4.  
  5. Set xl = CreateObject("Excel.Application" )
  6.  
  7. Set data_wb = xl.Workbooks.Open(".......\data.xls")
  8. Set recv_wb = xl.Workbooks.Open(".......\fichier_receveur.xls")
  9.  
  10. data_wb.WorkSheets(1).Copy recv_wb.Sheets("graph" )
  11. xl.Save
  12. xl.Quit
(non testé)

T'en pense quoi ?
Expert Programmation

Déclare tes variables. :o 
Explique l'intérêt de la ligne 8 :??: 
Mets le résultat de l'ouverture de tes classeurs dans des variables (lignes 10 et 11) et réutilise-les (ligne 13 et 14) :o 
Revois la syntaxe pour définir un paramètre nommé :o 

On va l'avoir ;) 

La ligne 8 sert à effectuer un test d'existence de fichier ensuite (inutile dans ce code)...
En fait je crois avoir trouvé moins tordu (en plus j'ai entendu dire que le code VBA de project peut differer de celui d'excel)
Je vais creér une macro dans mon fichier "fichier_receveur.xls" et je vais lancer l'execution depuis Project

un truc du style:
  1. ExcelAppli.Application.Run "fichier_receveur.xls!fusion_fonction"


ça serait plus efficace tu penses?

Je débute en VBA donc si je parais assez "brouillon" c'est que je le suis :) 
Merci pour le bout de code, cependant une question. Quand tu définies ton objet style
  1. Set data_wb = xl.Workbooks.Open(".......\data.xls" )
c'est considéré comme une feuille Excel? Je ne savais pas qu'on pouvait définir un objet comme application.workbooks, en tout cas ça a l'air bien pratique :) 

J'ai essayé comme tu me l'as indiqué:
  1. FileSaveAs Name:="D:\data_1.xls", _
  2. FormatID:="MSProject.XLS8", _
  3. map:="ExportGoMeeting"
  4.  
  5. Dim ExcelAppli As Object
  6. Dim data_1 As Object
  7. Dim recv As Object
  8.  
  9. Set ExcelAppli = CreateObject("Excel.application")
  10. Set recv = ExcelAppli.Workbooks.Open("D:\fichier_receveur.xls")
  11. ExcelAppli.Visible = True
  12. Set Data1 = ExcelAppli.Workbooks.Open("D:\fichier_data.xls")
  13. ExcelAppli.Visible = False
  14. Data1.WorkSheets("Export").Select
  15. Data1.WorkSheets("Export").Copy recv.Sheets("comp_j")


Le debuger me dit "erreur d'execution '424' Objet requis"
En me surlignant la ligne "Data1.WorkSheets("Export").Select"
Expert Programmation

apapa59 a dit :
Je débute en VBA donc si je parais assez "brouillon" c'est que je le suis :) 
Je ne vois pas le rapport :p 

apapa59 a dit :
Quand tu définies ton objet style
  1. Set data_wb = xl.Workbooks.Open(".......\data.xls" )
c'est considéré comme une feuille Excel?
Ben non. C'est considéré comme un classeur Excel. Faudrait voir à parler le même langage. Excel est une application (Application) qui ouvre des classeurs (Workbooks) qui contiennent des feuilles (Sheets) - on dit aussi onglets - qui peuvent être de nature différente. La plus utile étant la feuille de calcul (Worksheet).

apapa59 a dit :
Je ne savais pas que....
T'inquiète, t'es là pour en savoir plus, et pour en savoir mieux :sol: 

Bon, alors M. Brouillon, tu vas me mettre Option Explicit tout en haut de ton code, avant tout le reste. Et en plus, tu vas me mettre le curseur sur Explicit et appuyer sur [F1]. Ensuite tu me lis tout le laïus sur le sujet, et tu seras moins bête.

Parce que déclarer une variable data_1 pour ensuite utiliser Data1, c'est de la bêtise. (Ou de la brouillonerie :D  ).

Même chose pour les lignes 11 et 13. Je les trouve un peu redondantes.
Mets cette ligne juste après la création de l'objet Excel (ligne 9).

Tu es sûr d'avoir un onglet qui s'appelle Export ?
Pis d'abord, pourquoi te sens-tu obligé de sélectionner cette feuille (ligne 14) ?


A te lire...

Merci du temps que tu m'accordes :) 
Pardon pour l'erreur Woorkbook/Sheet (Mr Brouillon a aussi le cerveau brouillon...[:-xtreme-:13])

J'ai compliqué un peu le module dans le sens où:
-j'enregistre mon .mpp dans un dossier 1 (data_1.xls)
-je n'utilise pas directement le fichier receveur, présent dans un dossier 2, mais je le copie dans le dossier 1
je fais pour cela un test pour savoir si la copie existe déjà ou non ( d'où ma ligne FSO)
(il me sert en quelque sorte de fichier source pour d'autres modules)
-j'effectue la manip de copie de feuille du fichier data_1 vers copie_fichier_receveur
-je sauvegarde cette copie
-je supprime le fichier data_1

Ce qui donne (après lecture attentive de l'aide sur Explicit :whistle:  ) le code suivant

  1. Option Explicit
  2. Public Const Chemin1 = "D:\Documents\auguste1\stage\tests\Simulation\1\"
  3. Public Const Chemin2 = "D:\Documents\auguste1\stage\tests\Simulation\2\"
  4. Sub export()
  5.  
  6.  
  7. FileSaveAs Name:=Chemin1 & "fichier_data.xls", _
  8. FormatID:="MSProject.XLS8", _
  9. map:="ExportGoMeeting"
  10.  
  11. Dim ExcelAppli As Object
  12. Dim objFSO As Object
  13. Dim Data1 As Object
  14. Dim recv As Object
  15. Dim copie_recv As Object
  16.  
  17. Set ExcelAppli = CreateObject("Excel.application")
  18. ExcelAppli.Visible = True
  19. Set objFSO = CreateObject("Scripting.FileSystemObject")
  20. Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")
  21.  
  22. If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
  23. Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
  24. ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
  25. Set copie_recv = ExcelAppli.Open(Chemin1 & "fichier_receveur_copie.xls")
  26. Else
  27. Set copie_recv = ExcelAppli.Open(Chemin1 & "fichier_receveur_copie.xls")
  28. End If
  29.  
  30. Data1.WorkSheets("Export").Copy copie_recv.Sheets("comparaison_journaliere")
  31.  
  32. ExcelAppli.copie_recv.Save
  33. ExcelAppli.DisplayAlerts = False
  34. ExcelAppli.Quit
  35. ExcelAppli.DisplayAlerts = True
  36.  
  37. Set objFSO = CreateObject("Scripting.FileSystemObject")
  38. objFSO.DeleteFile (Chemin1 & "fichier_data.xls")
  39.  
  40. Set ExcelAppli = Nothing
  41. Set objFSO = Nothing
  42.  
  43.  
  44.  
  45.  
  46. End Sub


il me dit que fichier_data est introuvable... (à la méthode Excel.Appli.workbooks.Open(Chemin1 & "fichier_data.xls") )
Sinon d'autres erreurs?

J'ai finalement corrigé les petites "coquilles" qui trainaient

j'arrive à un résultat presque satisfaisant, le rendu final étant mon fichier_copie avec la feuille Export en plus dessus :) 
Le code corrigé:

  1. Option Explicit
  2. Public Const Chemin1 = "D:\blablabla\1\"
  3. Public Const Chemin2 = "D:\blablabla\2\"
  4. Sub export()
  5.  
  6.  
  7. FileSaveAs Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"
  8.  
  9.  
  10. Dim ExcelAppli As Object
  11. Dim objFSO As Object
  12. Dim Data1 As Object
  13. Dim recv As Object
  14. Dim copie_recv As Object
  15.  
  16. Set ExcelAppli = CreateObject("Excel.application")
  17. ExcelAppli.Visible = True
  18. Set objFSO = CreateObject("Scripting.FileSystemObject")
  19. Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")
  20.  
  21. If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
  22. Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
  23. ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
  24. Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
  25. Else
  26. Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
  27. End If
  28.  
  29. Data1.WorkSheets("Export").Copy Before:=copie_recv.WorkSheets("comparaison_jour")
  30.  
  31. ExcelAppli.copie_recv.SaveAs
  32. ExcelAppli.DisplayAlerts = False
  33. ExcelAppli.Quit
  34. ExcelAppli.DisplayAlerts = True
  35.  
  36. Set objFSO = CreateObject("Scripting.FileSystemObject")
  37. objFSO.DeleteFile (Chemin1 & "fichier_data.xls")
  38.  
  39. Set ExcelAppli = Nothing
  40. Set objFSO = Nothing
  41.  
  42.  
  43.  
  44.  
  45. End Sub


Petite erreur cependant à la fin, la ligne 31 etant problématique ("Méthode non gérée pour cet objet...)
Expert Programmation

  1. Option Explicit
  2.  
  3. ' // J'ai retiré ton nom, gros malin.
  4. Public Const Chemin1 = "D:\Documents\auguste1\stage\tests\Simulation\1\"
  5. Public Const Chemin2 = "D:\Documents\auguste1\stage\tests\Simulation\2\"
  6. Sub export()
  7.  
  8.  
  9. FileSaveAs Name:=Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"
  10.  
  11. Dim ExcelAppli As Object
  12. Dim objFSO As Object
  13. Dim Data1 As Object
  14. Dim recv As Object
  15. Dim copie_recv As Object
  16.  
  17. Set ExcelAppli = CreateObject("Excel.application" )
  18. ExcelAppli.Visible = True
  19.  
  20. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  21.  
  22. ' // Si tu n'es pas sûr que le chemin existe, fais une vérif :
  23. If Not objFSO.FileExists(Chemin1 & "fichier_data.xls" ) Then
  24. MsgBox "Le fichier " & Chemin1 & "fichier_data.xls n'existe pas", vbCritical
  25. Exit Sub
  26. ' // On a un problème. On a quitter la procédure sans fermer Excel. Donc il faudra remonter tout ce bloc avant l'ouverture d'Excel
  27. End If
  28.  
  29. Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls" )
  30.  
  31. ' // = False / = True beurk
  32. If Not objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls" ) Then
  33. Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls" )
  34. recv.SaveAs Chemin1 & "fichier_receveur_copie.xls"
  35. End If
  36.  
  37. ' // Plutôt que de le faire dans les deux cas, sors-le du if !
  38. Set copie_recv = ExcelAppli.Worbooks.Open(Chemin1 & "fichier_receveur_copie.xls" )
  39.  
  40. ' // Si comparaison_journaliere est une feuille de calcul, tu peux utiliser Worksheets()
  41. Data1.WorkSheets("Export" ).Copy copie_recv.Sheets("comparaison_journaliere" )
  42.  
  43. ExcelAppli.copie_recv.Save
  44. ExcelAppli.DisplayAlerts = False
  45. ExcelAppli.Quit
  46.  
  47. ' // Mettre ce genre de code, le plus tôt possible.
  48. Set ExcelAppli = Nothing
  49.  
  50. ' // Là, normalement, on a quitter Excel, alors ça ne sert plus trop à rien, hein !!!
  51. ExcelAppli.DisplayAlerts = True ' ///// <-- supprimer cette ligne
  52.  
  53. ' // objFSO est déjà un Scripting.FileSystemObject. Pas la peine de le refaire !
  54. Set objFSO = CreateObject("Scripting.FileSystemObject" ) ' ///// <-- supprimer cette ligne
  55. objFSO.DeleteFile (Chemin1 & "fichier_data.xls" )
  56.  
  57. ' // Inutile, car trop près de la fin de la macro, qui va de toute façon mettre Nothing dans objFSO
  58. Set objFSO = Nothing ///// <-- supprimer cette ligne
  59.  
  60. End Sub

Après tous tes conseils, j'aboutis à ceci:

  1. Option Explicit
  2. Public Const Chemin1 = "D:\blablabla\1\"
  3. Public Const Chemin2 = "D:\blablabla\2\"
  4. Sub export()
  5.  
  6. FileSaveAs Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"
  7.  
  8. Dim ExcelAppli As Object
  9. Dim objFSO As Object
  10. Dim Data1 As Object
  11. Dim recv As Object
  12. Dim copie_recv As Object
  13.  
  14. Set ExcelAppli = CreateObject("Excel.application")
  15. ExcelAppli.Visible = True
  16. Set objFSO = CreateObject("Scripting.FileSystemObject")
  17. Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")
  18.  
  19. If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
  20. Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
  21. ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
  22. End If
  23.  
  24.  
  25. Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
  26. Data1.WorkSheets("Export").Copy Before:=copie_recv.WorkSheets("comparaison_jour")
  27.  
  28. ExcelAppli.copie_recv.SaveAs
  29. ExcelAppli.DisplayAlerts = False
  30. ExcelAppli.Quit
  31. Set ExcelAppli = Nothing
  32.  
  33. objFSO.DeleteFile (Chemin1 & "fichier_data.xls")
  34. Set objFSO = Nothing
  35.  
  36. End Sub



et toujours ce problème de sauvegarde à la fin :/ 
Mais en tout cas merci pour tout, ça a bien avancé
(je savais pas ce qu'était le VBA y'a une semaine)
Expert Programmation

Salut, :) 

Et si tu relisais mon code et les commentaires que j'y faisais et que tu le comparais au tien.
Par exemple, lignes 58/34 (mon/ton code), ou 43/28.

Pis arrête avec les
  1. = False
Utilise un Not(lignes 23/19)

Et pire que tout, tu utilises un ActiveTruc (que j'avais laissé passer, mais j'ai corrigé mon code). Ligne 20 de ton code, tu définis une variable, ligne 21, tu ne la réutilises pas. C'est nul.

Bon, tu as tous les éléments pour que ça marche, d'une part, et pour que ça marche bien d'autre part. Enjoy!
:) 
Expert Programmation

Hey!!!!!!!!!!!

T'as plus qu'à choisir la moins mauvaise réponse, et à cliquer sur son bouton Élire meilleure réponse pour effectivement passer le topic en résolu ;) 

A bientôt :) 
Lassé par la pub ? Créez un compte