Manipulation d'Objet Workbook et Worksheet pour copy
Bonjour à tous
Petit soucis de compréhension de ma part concernant l'utilisation des objets en VBA
Mon objectif est de copier des feuilles d'un Classeur vers un autre précédemment crée
Cependant je n'arrive pas à comprendre comment fonctionne et comment utiliser les objets en VBA, s'il vous plait éclairez ma lanterne
Sub NouveauPlanning()
Dim resultat As String
Dim classeur As Workbook
Dim xlSheet As Excel.Worksheet
Dim xlApp As New Excel.Application
'Creation objet WB et WS
Set WorkbooksOrig = ActiveWorkbook
Set FeuilleACopy = WorkbooksOrig.Worksheets("Planning Détail")
'Creation nouveau fichier
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier")
'La variable reçoit la valeur entrée dans l'InputBox
Set newclasseur = xlApp.Workbooks.Add
newclasseur.SaveAs nouvFich
'Affiche le classeur crée
xlApp.Visible = True
Set classeur = xlApp.Workbooks(nouvFich)
'NE FONCTIONNE PAS
classeur.Activate
'RENVOIE FICHIER ORIGINE ET PAS FICHIER CREE
nameClasseurActif = ActiveWorkbook.Name
'MsgBox " nameClasseurActif : " & nameClasseurActif
'Creation objet WS
Set FeuilleDest = classeur.Worksheets(1)
'NE FONCTIONNE PAS
FeuilleDest.Activate
classeur.Worksheets(1).Activate
FeuilleDest.Cells(1, 1) = "ezf"
ActiveSheet.Cells(1, 2) = "testte"
'Copie fichier planning -> BUUUUUUG
FeuilleACopy.Copy After:=FeuilleDest
1) Pourquoi on crée un objet avec une méthode de classe
Set newclasseur = xlApp.Workbooks.Add
Pourquoi est-ce qu'on ne fais pas : Crée une instance de la classe Workbooks puis application de la méthode ?
Set newclasseur = xlApp.Workbooks
newclasseur.Add
2)Le code suivant ne crée pas de bug mais ne fonctionne pas, pourquoi ? Manipulez l'objet "classeur" ne revient pas à manipuler le classeur crée ?
Set classeur = xlApp.Workbooks(nouvFich)
classeur.Activate
3)De même pour l'activation de la feuille FeuilleDest,
Set FeuilleDest = classeur.Worksheets(1)
FeuilleDest.Activate
Merci pour vos conseils et votre aide !
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
1) Pourquoi on crée un objet avec une méthode de classe ?
Le nouvel objet créé avec une méthode de classe, c'est à dire avec le mot-clé "New" est une 2ème application Excel (Dim xlApp As New Excel.Application)
Cette instruction : "Set newclasseur = xlApp.Workbooks.Add" combine 2 actions :
1- création d'un nouveau classeur dans la 2ème application Excel
2- assignation de la variable objet = newclasseur à ce nouveau classeur
Cette instruction : "Set newclasseur = xlApp.Workbooks" affecte la variable objet = newclasseur à la collection des classeurs de la 2ème application Excel. Le nom de cette variable est illogique car elle ne représente pas un classeur mais une collection, elle devrait s'appeler "newcollection"
Si l'on veut retrouver les 2 actions précédentes, les instructions devraient être les suivantes :
Set newcollection = xlApp.Workbooks
newcollection.Add
Set newclasseur = ActiveWorkBook
2)Le code suivant ne crée pas de bug mais ne fonctionne pas, pourquoi ? Manipulez l'objet "classeur" ne revient pas à manipuler le classeur crée ?
Set classeur = xlApp.Workbooks(nouvFich)
"nouvFich" doit être uniquement le nom du fichier. Or "nouvFich" est le chemin + le nom du fichier.
D'ailleurs, la variable objet = newclasseur est toujours disponible, cette instruction devrait donc fonctionner :
Set classeur = newclasseur.
Bonjour Thev
Merci de ton retour, encore quelques points que je ne saisis pas :
1/J'obtiens l'erreur "Erreur d'execution '438 - Propriété ou méthode non gérée par cet objet" avec ce code
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newCollec = xlApp.Workbooks
newCollec.Add
newCollec.SaveAs nouvFich
mais pas avec celui-ci
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newCollec = xlApp.Workbooks.Add
newCollec.SaveAs nouvFich
2/
"nouvFich" doit être uniquement le nom du fichier. Or "nouvFich" est le chemin + le nom du fichier.
Ici nouvFich est bien le nom de mon fichier, rentré par l'utilisateur, même en rajoutant l'extension du fichier ça ne semble pas fonctionner
L'indice n'appartient pas à la sélection
Set newclasseur2 = xlApp.Workbooks(nouvFich & ".xlsm")
J'avais utilisé cette méthode car la nouvelle variable newclasseur prends la valeur du fichier origine (ou se trouve le code) ET NON PAS du fichier nouvellement crée
Set newclasseur = ActiveWorkbook
Des idées ?
Merci !
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
J'obtiens l'erreur "Erreur d'execution '438 - Propriété ou méthode non gérée par cet objet" avec ce code
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newCollec = xlApp.Workbooks
newCollec.Add
newCollec.SaveAs nouvFich
Normal : la variable objet newCollec est une collection de classeurs (cad un ensemble de classeurs) et non un classeur
mais pas avec celui-ci
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newCollec = xlApp.Workbooks.Add
newCollec.SaveAs nouvFich
Bien sûr car cette fois la variable objet = newCollec représente un classeur car c'est le résultat de la méthode WorkBooks.Add
Ici nouvFich est bien le nom de mon fichier, rentré par l'utilisateur, même en rajoutant l'extension du fichier ça ne semble pas fonctionner .
Pour le nom du fichier, il faut effectivement l'extension mais ajoutez-vous la bonne, car "SaveAs nouvFich" attribue une extension par défaut qui pourrait être ".xlsx" selon le paramètres de l'application?
J'avais utilisé cette méthode car la nouvelle variable newclasseur prends la valeur du fichier origine (ou se trouve le code) ET NON PAS du fichier nouvellement crée
Pas du tout. La variable objet "newclasseur " correspond au nouveau classeur créé dans la 2ème application Excel
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newClasseur = xlApp.Workbooks.Add
newClasseur.SaveAs nouvFich
Merci pour ta réponse
Bien sûr car cette fois la variable objet = newCollec représente un classeur car c'est le résultat de la méthode WorkBooks.Add
OK !!!
Pour le nom du fichier, il faut effectivement l'extension mais ajoutez-vous la bonne, car "SaveAs nouvFich" attribue une extension par défaut qui pourrait être ".xlsx" selon le paramètres de l'application?
Que ce soit en forçant l'enregistrement en ".xlsm" ou en utilisant l'extension par défault, je n'arrive toujours pas à activer le nouveau classeur crée
newCollec.SaveAs Filename:=nouvFich, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Set newclasseur2 = xlApp.Workbooks(nouvFich & ".xlsm")
newclasseur2.Activate
'Renvoie fichier d'origine
MsgBox (ActiveWorkbook.Name)
Pas du tout. La variable objet "newclasseur " correspond au nouveau classeur créé dans la 2ème application Excel
Malheureusement chez moi je ne comprends pas pourquoi ça ne fonctionne pas .. le classeur actif reste le fichier d'origine.
Set newCollec = xlApp.Workbooks.Add
xlApp.Visible = True
Set newClasseur = ActiveWorkbook
'Renvoie fichier origine
MsgBox (newClasseur.Name)
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Utliser ce code :
nouvFich = InputBox("Veuillez entrer le nom du nouveau classeur", "Nouveau fichier") 'La variable reçoit la valeur entrée dans l'InputBox
MsgBox nouvFich
Set newClasseur = xlApp.Workbooks.Add
newClasseur.SaveAs nouvFich
xlApp.Visible = True
'Renvoie fichier sauvegardé
MsgBox (newClasseur.Name))