> Tous les forums > Forum Bureautique
 VBA copier une feuille dans un autre classeurSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
Kassie
  Posté le 06/06/2019 @ 21:40 
Aller en bas de la page 
Petite astucienne

Bonjour à tous,

J'ai un nouveau projet à monter et malheureusement, malgré mes recherches et multiples essais, ça ne fonctionne pas. Je demande donc votre aide pour y voir clair, svp.

J'ai des factures mensuelles que je souhaite copier dans un classeur de sommaire pour ensuite pouvoir faire différents calculs.

La feuille a copier n'ayant jamais le même nom, je tente l'utilisation d'une boite texte pour définir le nom du classeur à importer. Voici ce que j'ai jusqu'à maintenant, malheureusement non fonctionnel :

Sub CopierDansSommaire()

Dim NomClasseur As String

Dim FactureMensuelle As Workbook

Dim Sommaire As Workbook

Dim FeuilleFacture As Worksheet

NomClasseur = InputBox("Quel est le nom du classeur ouvert d'où proviennent les données?")

Set FactureMensuelle = Workbooks(NomClasseur)

Set Sommaire = Workbooks("SOMMAIRE_Elus.xls")

For Each FeuilleFacture In FactureMensuelle.Sheets

FeuilleFacture.Copy After:=Workbooks("SOMMAIRE_Elus.xls").Sheets(Sommaire.Sheets.Count)

Next

End Sub

Je demande la copie à la fin des feuilles dans ce code, ne sachant pas comment le faire sur la feuille active. Si c'était possible de l'envoyer dans la feuille active de Sommaire, comme ça je pourrais me positionner sur la bonne feuille (dans le fond je n'ai besoin et il n'y a qu'une feuille dans FactureMensuelle). Je pourrais ainsi préparer mes onglets des 12 mois d'avance.

Un gros gros merci d'avance les astuciens !

Publicité
Debrief
 Posté le 07/06/2019 à 07:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Questions...

La feuille a copier n'ayant jamais le même nom, je tente l'utilisation d'une boite texte pour définir le nom du classeur à importer

1 - Il s'agit des feuilles à copier d'un classeur Facture qui n'a jamais le même nom, correct ?

2 - Dans ces classeurs Facture, il y a 1 ou plusieurs feuilles ou toujours 1 seule feuille ?

3 - Dans quel classeur se trouve le code VBA ? Dans un classeur indépendant juste destiné à faire les copies ou dans le classeur "Sommaire" ?

Je demande la copie à la fin des feuilles dans ce code, ne sachant pas comment le faire sur la feuille active.

4 - Je ne comprends pas cette histoire de feuille active. Comment veux-tu copier plusieurs feuilles de classeur Facture dans la feuille active du classeur Sommaire ?

Debrief
 Posté le 07/06/2019 à 08:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Je demande la copie à la fin des feuilles dans ce code, ne sachant pas comment le faire sur la feuille active.

La feuille active est la feuille du classeur que tu choisis d'activer soit en cliquant sur le nom de la feuille, soit en l'activant en VBA (<Classeur>.<Feuille>.Activate). Peu importe où se trouve cette feuille dans le classeur.
Ce n'est pas la feuille vierge qui s'affiche par défaut à laquelle tu penses et sur laquelle tu voudrais copier ta feuille "Facture".
Cette feuille vierge serait d'ailleurs à supprimer (ou au moins à ignorer) car elle ne correspond à rien dans ton classeur "Sommaire".

=> Est-ce que la copie à la fin des feuilles est un choix de classement ? Ou lorsque tu copies un feuille "Facture" tu la voudrais plutôt en position 1 dans la liste des feuilles du classeur "Sommaire" ?

Debrief
 Posté le 07/06/2019 à 21:50 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

En attendant tes réponses j'ai fait un fichier Excel indépendant avec macros qui permet de copier des feuilles d'un classeur source vers un classeur destination -> supprimé

A essayer... !?



Modifié par Debrief le 08/06/2019 08:19
Debrief
 Posté le 10/06/2019 à 14:37 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

En retombant par hasard sur ce sujet dont l'auteure a mystérieusement disparu, j'ai discuté avec Sherlock Holmes qui m'a fait part de la remarque suivante.

- Sherlock:
« Si Kassie (l'auteure mystérieusement disparue) a souhaité une copie de(s) feuille(s) "sur la feuille active", c'est probablement parce qu'elle part d'un nouveau classeur qui ouvre par défaut 1 feuille vierge dont elle n'a que faire et qu'elle voit comme "la feuille active".»
« Si elle veut y copier une ou des feuilles venant d'ailleurs c'est qu'elle souhaite tout simplement n'avoir dans son classeur final que les feuilles copiées et donc se débarrasser de cette fichue feuille initiale vierge. »

- Moi:
« Dans ce cas, rien ne l'empêche de supprimer manuellement cette feuille. »

- Sherlock:
« Certes mon cher Watson, mais si vous faites des macros, ce n'est pas pour finir le travail à la main ! »

- Moi:
« Ce n'est pas là tâche aisée Holmes, il peut lui arriver des tas de choses à cette feuille que vous voulez me faire supprimer, et elle pourrait l'être mal à propos, si elle venait à être utilisée par exemple... »

- Sherlock:
« A vous de voir Watson, ce n'est pas parce que les choses sont difficiles que nous n'osons pas, mais parce que nous n'osons pas qu'elles sont difficiles (Sénèque) »

Du coup, je me suis senti obligé de produire une nouvelle mouture https://www.cjoint.com/c/IFkmHIhYQln capable de supprimer cette foutue feuille vierge d'un nouveau classeur destination lors de la 1ère opération de copie, en veillant à ce que ce ne soit pas "mal à propos".

Watson.

Kassie
 Posté le 10/06/2019 à 15:58 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

Bonjour,

Non non, elle n'a pas disparu, elle était seulement retenue hors du monde informatique quelques jours. La revoici avec la ferme intention de produire quelque chose de correct et fonctionnel... avec votre aide tant appréciée !

Voici réponse aux questions:

1- Il s'agit en effet de copier à partir d'un classeur (Facture) qui n'a jamais le même nom. Le nom de ce classeur est défini par le fournisseur de service selon le mois de facturation et le groupe facturé.

2- Il n'y a toujours qu'une seule feuille par "Facture" et elle s'appelle "Informations détaillées" (si ça peut être utile...)

3- Le code VBA se trouve dans le classeur Sommaire. J'ai un classeur sommaire par groupe (j'utiliserai le même code pour mes différents classeurs Sommaire. Ex: Sommaires - Cadres - 2019)

4- La feuille active est l'endroit où je veux importer mes données "Facture". Je comptais préparer mes 12 onglets mensuels, me positionner sur la feuille à importer (ex: juin) et l'importer à cet endroit. Peut-être est-ce plus simple de l'importer à la fin et de renommer mon onglet créé à l'importation ?

Debrief, je te remercie de ton aide généreuse. Je vais analyser et comprendre tes fichiers joints dès à présent.

Kassie
 Posté le 10/06/2019 à 16:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

J'ai été lire et farfouiller dans le code du classeur que tu as inclus. Ouille ! Je ne comprends pas grand chose quand on tombe au "Bolean" et variables. J'aimerais tant pourtant ! Je dois vraiment mettre sur ma "toDo" d'apprendre à écrire du VBA comma ça.

J'ai tout de même réussi à faire ce que je voulais en simplifiant le tout à l'extrême et repartant de ma macro de base. Voici ce que ça donne.

Sub CopierDansSommaire()

Dim NomClasseur As String

Dim FactureMensuelle As Workbook

Dim Sommaire As Workbook

Dim FeuilleFacture As Worksheet

NomClasseur = InputBox("Quel est le nom du classeur ouvert d'où proviennent les données(avec.xlsx)?")

Set FactureMensuelle = Workbooks(NomClasseur)

Set Sommaire = Workbooks("SOMMAIRE_Elus.xlsm")

For Each FeuilleFacture In FactureMensuelle.Sheets

FeuilleFacture.Copy After:=Workbooks("SOMMAIRE_Elus.xlsm").Sheets(Sommaire.Sheets.Count)

Next

Sheets("Informations détaillées").Name = InputBox("Quel est le mois importé?")

End Sub

C'est amplement suffisant pour importer mes données. Reste maintenant à compiler le tout dans sommaire, selon le numéro d'employé...

Par contre, idéalement, j'aimerais que cette macro ouvre le classeur nécessaire plutôt que demander lequel est ouvert. Je n'arrive pas à décortiquer ton code pour n'utiliser que la portion nécessaire, sans marquer le nom du classeur dans une case. Veux-tu m'aider pour cette portion svp ?

Un immense merci et je garde précieusement ton classeur pour l'étudier et arriver à le comprendre !



Modifié par Kassie le 10/06/2019 16:44
Debrief
 Posté le 10/06/2019 à 18:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bravo pour avoir réussi à faire fonctionner ton programme !

Concernant l'ouverture d'un classeur il te suffit d'extraire et d'utiliser la fonction Private Function OpenWorkbook().
Par exemple:

Set FactureMensuelle = OpenWorkbook(Message:=True)

If FactureMensuelle is Nothing then
'Aucune classeur n'a été ouvert
Else
'Un classeur a été ouvert
End If

Le paramètre optionnel Message:=True dit à la fonction d'afficher le message comme quoi le fichier est ouvert...
Si tu l'enlèves, la valeur par défaut étant False, aucun message ne sera affiché par la fonction.

Debrief
 Posté le 10/06/2019 à 18:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Reste maintenant à compiler le tout dans sommaire, selon le numéro d'employé...

C'est quoi le problème au juste ?

Je comptais préparer mes 12 onglets mensuels, me positionner sur la feuille à importer (ex: juin) et l'importer à cet endroit. Peut-être est-ce plus simple de l'importer à la fin et de renommer mon onglet créé à l'importation ?

Non, tu ne vas pas faire une macro et en parallèle faire des manips manuelles complexes. Comme dit Sherlock: « Certes mon cher Watson, mais si vous faites des macros, ce n'est pas pour finir le travail à la main ! »

Je ne connais pas bien la logique de ton affaire mais rien ne t'empêche de saisir le nom de la feuille que tu viens de copier et de la renommer avec ce nom saisi. Ou si c'est des noms de mois, donner son numéro et générer son nom.
Donc tu n'importe pas "sur" la feuille, tu importes "une" feuille que tu nommes de la manière qui te plait.



Modifié par Debrief le 10/06/2019 19:07
Publicité
Kassie
 Posté le 10/06/2019 à 19:05 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

Merci, j'intègre ça immédiatement dans mon code et je teste.

Pour le sommaire, j'ai créé une nouvelle question, pour ne pas mêler les cartes. https://forum.pcastuces.com/sommaire___vba-f23s40018.htm

Merci encore !

Kassie
 Posté le 10/06/2019 à 20:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

Je ne connais pas bien la logique de ton affaire mais rien ne t'empêche de saisir le nom de la feuille que tu viens de copier et de la renommer avec ce nom saisi. Ou si c'est des noms de mois, donner son numéro et générer son nom.Donc tu n'importe pas "sur" la feuille, tu importes "une" feuille que tu nommes de la manière qui te plait.

C'est ce que je fais avec la dernière mouture. Merci !

Par contre, le OpenWorkbook, je n'y arrive pas. Ce doit être tout bête mais non, je n'y arrive pas. Voudrais-tu me clarifier le tout svp, quoi ajouter et où?

merci

Debrief
 Posté le 10/06/2019 à 20:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

OK je regarde ça plus tard dans la soirée et t'envoie un fichier.

Question: lorsque tu copies une feuille Facture dans le Sommaire, c'est bien 1 seule feuille Facture pour 1 mois donné, correct ?

Envoie ta dernière mouture que je m'y cale :)

Kassie
 Posté le 10/06/2019 à 21:43 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

En dernière mouture (J'ai continué à bosser dessus et à tenter de comprendre) j'arrive à ouvrir le fichier de facture mais pas réutiliser la variable NomClasseur dans la macro, même en la déclarant publique. J'ai définitivement besoin d'un cours et je vais aller le chercher! En attendant, merci encore et encore pour ton aide.

Voici le classeur Sommaire: https://www.cjoint.com/c/IFktN5wuTAw

Et voici un exemple de facture: https://www.cjoint.com/c/IFktQOjVKyw

Debrief
 Posté le 11/06/2019 à 02:30 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

J'arrive à ouvrir le fichier de facture mais pas réutiliser la variable NomClasseur dans la macro, même en la déclarant publique

Je trouve que tu te débrouilles très bien !

La variable NomClasseur que tu as valorisée avec NomClasseur = Application.GetOpenFilename() contient le nom complet du fichier (i.e. le chemin + le nom du fichier). C'est le FactureMensuelle.FullName.

Subtilité... Tu ne peux pas indicer les Workbooks ouverts avec le nom complet. Il faut utiliser le nom du fichier, le FactureMensuelle.Name, que tu obtiens par exemple avec Mid(NomClasseur, InStrRev(NomClasseur, "\") + 1).

La portée de la variable Public ou Private n'a pas d'influence dans cette affaire.

D'autre part, tu n'as pas besoin d'une variables pour le classeur Sommaire dans lequel se trouve la macro. Il suffit de le désigner par ThisWorkbook.

Je t'envoie une version adaptée demain matin.

Edit: Comme on et déjà demain matin je t'envoie le module à importer après suppression de ton Module1 -> supprimé.



Modifié par Debrief le 11/06/2019 09:28
Debrief
 Posté le 11/06/2019 à 09:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Quelques améliorations mineures, notamment pour couvrir le cas de plusieurs feuilles en classeur Facture, car ton code initial prévoit de boucler sur toutes les feuilles (For Each FeuilleFacture In FactureMensuelle.Sheets et donc plusieurs feuillespotentiellement). La touche Annuler permet de ne pas copier une feuille et de passer à la suivante.

Module ModuleTransfererFeuille.bas en remplacement du précédent -> https://www.cjoint.com/c/IFllKhprzXP

Edit: Petite correction grammaticale d'un prompt.



Modifié par Debrief le 11/06/2019 13:37
Kassie
 Posté le 11/06/2019 à 16:13 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petite astucienne

C'est absolument PARFAIT !

Un immense MERCI Debrief pour ton aide, elle m'est précieuse. Je ne sais comment t'exprimer plus complètement ma gratitude!

Bonne journée !

Debrief
 Posté le 11/06/2019 à 16:52 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Merci Kassie, j'en rougis d'émotion . C'est ça l'entraide PC Astuces

D.

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
199,99 €Ecran ultra large LG 29 pouces 29WL500-B à 199,99 €
Valable jusqu'au 15 Juin

Boulanger propose actuellement l'écran 29 pouces LG 29WL500-B à 199,99 € livré gratuitement alors qu'on le trouve à partir de 229 € ailleurs. Cet écran ultra large est au format 21/9, possède une dalle IPS et offre une résolution de 2560 x 1080 pixels. Avec lui, vous pourrez bénéficier d'une plus grande immersion dans les jeux et les films. Cet écran est compatible FreeSync.


> Voir l'offre
21,90 €Switch Gigabit TP-Link 8 ports métal à 21,90 €
Valable jusqu'au 15 Juin

Amazon propose actuellement le switch Gigabit TP-Link TL-SG108 8 ports (10/100/1000) dans un boîtier métal à 21,90 €. On le trouve habituellement autour de 30 €. 


> Voir l'offre
14,89 €Clé USB Sandisk Ultra 64 Go à double connectique USB 3.1 Type A et C à 14,89 €
Valable jusqu'au 16 Juin

Amazon fait une promotion sur la clé USB Sandisk Ultra 64 Go à double connectique USB 3.1 Type A et C qui passe à 14,89 € alors qu'on la trouve ailleurs à plus de 25 €. Cette clé USB  dispose d'un connecteur réversible USB Type C et d'un connecteur classique de type A. Grâce à elle, transférez en toute simplicité et rapidement (jusqu'à 150 Mo/s) vos fichiers entre vos smartphones, tablettes et ordinateurs. 


> Voir l'offre

Sujets relatifs
Excel 2007 Copier/Coller d’une feuille à l’autre Dans un même classeur.
Macro VBa copier /coller dans autre feuille a modifier ??
copier une cellule dans un autre classeur
Déplacer une feuille dans un autre classeur
copier une feuille dans un classeur
Copier 1 feuille xls dans un autre fichier
copier un dossier calc de 15 feuilles dans un autre dossier calc
Copier une plage excel vers une autre feuille
mettre un tableau d'un classeur dans un autre classeur
Afficher tableau dans une ListBox sur une autre feuille
Plus de sujets relatifs à VBA copier une feuille dans un autre classeur
 > Tous les forums > Forum Bureautique