Résolu Export en VBA de MSProject sous Excel

apapa59

Nouveau membre
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)

Code:
Sub export_j()

FileSaveAs Name:="D:\blablabla\data.xls", _
                    FormatID:="MSProject.XLS8", _
                    map:="mon_mappage"

Set ExcelAppli = CreateObject("Excel.application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

ExcelAppli.Application.Workbooks.Open "D:\blablabla\data.xls"
ExcelAppli.Application.Workbooks.Open "D:\blablabla\fichier_receveur.xls"
ExcelAppli.Visible = True
ExcelAppli.Application.Workbooks("data.xls").Sheets("feuil1").Select
ExcelAppli.Application.Workbooks("data.xls").Sheets("feuil1").Copy Before=Workbooks("fichier_receveur.xls").Sheets("graph")



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

zeb

Modérateur
Salut,

A quelle ligne le débugger se fâche-il ?
En attendant, je jette un oeil à ton problème.
 

zeb

Modérateur
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 ;)
 

apapa59

Nouveau membre
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:
Code:
ExcelAppli.Application.Run "fichier_receveur.xls!fusion_fonction"

ça serait plus efficace tu penses?
 

zeb

Modérateur
Meilleure réponse
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....
Code:
Dim xl As Object
Dim data_wb As Object
Dim recv_wb As Object

Set xl = CreateObject("Excel.Application" )

Set data_wb = xl.Workbooks.Open(".......\data.xls")
Set recv_wb = xl.Workbooks.Open(".......\fichier_receveur.xls")

data_wb.WorkSheets(1).Copy recv_wb.Sheets("graph" )
xl.Save
xl.Quit
(non testé)

T'en pense quoi ?
 

apapa59

Nouveau membre
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
Code:
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 :)

 

apapa59

Nouveau membre
J'ai essayé comme tu me l'as indiqué:
Code:
FileSaveAs Name:="D:\data_1.xls", _
                    FormatID:="MSProject.XLS8", _
                    map:="ExportGoMeeting"

Dim ExcelAppli As Object
Dim data_1 As Object
Dim recv As Object

Set ExcelAppli = CreateObject("Excel.application")
Set recv = ExcelAppli.Workbooks.Open("D:\fichier_receveur.xls")
ExcelAppli.Visible = True
Set Data1 = ExcelAppli.Workbooks.Open("D:\fichier_data.xls")
ExcelAppli.Visible = False
Data1.WorkSheets("Export").Select
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"
 

zeb

Modérateur
Je ne vois pas le rapport :p

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).

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...
 

apapa59

Nouveau membre
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

Code:
Option Explicit
Public Const Chemin1 = "D:\Documents\auguste1\stage\tests\Simulation\1\"
Public Const Chemin2 = "D:\Documents\auguste1\stage\tests\Simulation\2\"
Sub export()


FileSaveAs Name:=Chemin1 & "fichier_data.xls", _
                    FormatID:="MSProject.XLS8", _
                    map:="ExportGoMeeting"

Dim ExcelAppli As Object
Dim objFSO As Object
Dim Data1 As Object
Dim recv As Object
Dim copie_recv As Object

Set ExcelAppli = CreateObject("Excel.application")
ExcelAppli.Visible = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")

If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
      Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
      ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
      Set copie_recv = ExcelAppli.Open(Chemin1 & "fichier_receveur_copie.xls")
   Else
      Set copie_recv = ExcelAppli.Open(Chemin1 & "fichier_receveur_copie.xls")
   End If

Data1.WorkSheets("Export").Copy copie_recv.Sheets("comparaison_journaliere")

ExcelAppli.copie_recv.Save
ExcelAppli.DisplayAlerts = False
ExcelAppli.Quit
ExcelAppli.DisplayAlerts = True

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile (Chemin1 & "fichier_data.xls")

Set ExcelAppli = Nothing
Set objFSO = Nothing

    
   

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?
 

apapa59

Nouveau membre
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é:

Code:
Option Explicit
Public Const Chemin1 = "D:\blablabla\1\"
Public Const Chemin2 = "D:\blablabla\2\"
Sub export()


FileSaveAs Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"


Dim ExcelAppli As Object
Dim objFSO As Object
Dim Data1 As Object
Dim recv As Object
Dim copie_recv As Object

Set ExcelAppli = CreateObject("Excel.application")
ExcelAppli.Visible = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")

If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
      Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
      ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
      Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
   Else
      Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
   End If

Data1.WorkSheets("Export").Copy Before:=copie_recv.WorkSheets("comparaison_jour")

ExcelAppli.copie_recv.SaveAs
ExcelAppli.DisplayAlerts = False
ExcelAppli.Quit
ExcelAppli.DisplayAlerts = True

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile (Chemin1 & "fichier_data.xls")

Set ExcelAppli = Nothing
Set objFSO = Nothing

    
   

End Sub

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

zeb

Modérateur
Code:
Option Explicit

' // J'ai retiré ton nom, gros malin.
Public Const Chemin1 = "D:\Documents\auguste1\stage\tests\Simulation\1\"
Public Const Chemin2 = "D:\Documents\auguste1\stage\tests\Simulation\2\"
Sub export()


FileSaveAs Name:=Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"

Dim ExcelAppli As Object
Dim objFSO As Object
Dim Data1 As Object
Dim recv As Object
Dim copie_recv As Object

Set ExcelAppli = CreateObject("Excel.application" )
ExcelAppli.Visible = True

Set objFSO = CreateObject("Scripting.FileSystemObject" )

' // Si tu n'es pas sûr que le chemin existe, fais une vérif :
If Not objFSO.FileExists(Chemin1 & "fichier_data.xls" ) Then
    MsgBox "Le fichier " & Chemin1 & "fichier_data.xls n'existe pas", vbCritical
    Exit Sub
    ' // 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
End If

Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls" )

' // = False / = True beurk
If Not objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls" ) Then
    Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls" )
    recv.SaveAs Chemin1 & "fichier_receveur_copie.xls"
End If

' // Plutôt que de le faire dans les deux cas, sors-le du if !
Set copie_recv = ExcelAppli.Worbooks.Open(Chemin1 & "fichier_receveur_copie.xls" )

' // Si comparaison_journaliere est une feuille de calcul, tu peux utiliser Worksheets()
Data1.WorkSheets("Export" ).Copy copie_recv.Sheets("comparaison_journaliere" )

ExcelAppli.copie_recv.Save
ExcelAppli.DisplayAlerts = False
ExcelAppli.Quit

' // Mettre ce genre de code, le plus tôt possible.
Set ExcelAppli = Nothing

' // Là, normalement, on a quitter Excel, alors ça ne sert plus trop à rien, hein !!!
ExcelAppli.DisplayAlerts = True  ' ///// <-- supprimer cette ligne

' // objFSO est déjà un Scripting.FileSystemObject. Pas la peine de le refaire !
Set objFSO = CreateObject("Scripting.FileSystemObject" ) ' ///// <-- supprimer cette ligne
objFSO.DeleteFile (Chemin1 & "fichier_data.xls" )

' // Inutile, car trop près de la fin de la macro, qui va de toute façon mettre Nothing dans objFSO
Set objFSO = Nothing ///// <-- supprimer cette ligne

End Sub
 

apapa59

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

Code:
Option Explicit
Public Const Chemin1 = "D:\blablabla\1\"
Public Const Chemin2 = "D:\blablabla\2\"
Sub export()

FileSaveAs Chemin1 & "fichier_data.xls", FormatID:="MSProject.XLS8", map:="ExportGoMeeting"

Dim ExcelAppli As Object
Dim objFSO As Object
Dim Data1 As Object
Dim recv As Object
Dim copie_recv As Object

Set ExcelAppli = CreateObject("Excel.application")
ExcelAppli.Visible = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Data1 = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_data.xls")

If objFSO.FileExists(Chemin1 & "fichier_receveur_copie.xls") = False Then
      Set recv = ExcelAppli.Workbooks.Open(Chemin2 & "fichier_receveur.xls")
      ExcelAppli.ActiveWorkbook.SaveAs (Chemin1 & "fichier_receveur_copie.xls")
End If
  

Set copie_recv = ExcelAppli.Workbooks.Open(Chemin1 & "fichier_receveur_copie.xls")
Data1.WorkSheets("Export").Copy Before:=copie_recv.WorkSheets("comparaison_jour")

ExcelAppli.copie_recv.SaveAs
ExcelAppli.DisplayAlerts = False
ExcelAppli.Quit
Set ExcelAppli = Nothing

objFSO.DeleteFile (Chemin1 & "fichier_data.xls")
Set objFSO = Nothing

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)
 

zeb

Modérateur
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
Code:
= 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!
:)
 

apapa59

Nouveau membre
J'ai bien réecrit le code avec tes indication :)
Tout fonctionne très bien merci pour tout!
 

zeb

Modérateur
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 :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 084
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut