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 !

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 !

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)

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))
Rechercher des sujets similaires à "manipulation objet workbook worksheet copy"