Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Copie plage de données d'un fichier Í  l'autre

5 réponses
Avatar
Alf
Bonjour Í  tous,
Existe t il un moyen plus rapide et autre que "plage.select, plage.copy" et paste dans le fichier cible, pour copier une plage de données d'une feuille d'un classeur ?
Cette manière m'oblige Í  réactiver le fichier source pour sélectionner la plage de données. Et quelque fois le passage d'une fenêtre Excel Í  une autre se passe mal (workbooks("xxx").activate).

Je voudrais, le fichier cible étant actif, récupérer les bonnes valeurs dans le fichier source sans le réactiver et faire mon opération de copie.
La plage est assez grande, et j'aimerais gagner en rapidité...

Est ce possible ?

Merci pour votre aide Í  tous
Alf

5 réponses

Avatar
MichD
Le 30/10/21 Í  12:11, Alf a écrit :
Le samedi 30 octobre 2021 Í  17:47:49 UTC+2, MichD a écrit :
Le 30/10/21 Í  11:21, Alf a écrit :
Bonjour Í  tous,
Existe t il un moyen plus rapide et autre que "plage.select, plage.copy" et paste dans le fichier cible, pour copier une plage de données d'une feuille d'un classeur ?
Cette manière m'oblige Í  réactiver le fichier source pour sélectionner la plage de données. Et quelque fois le passage d'une fenêtre Excel Í  une autre se passe mal (workbooks("xxx").activate).
Je voudrais, le fichier cible étant actif, récupérer les bonnes valeurs dans le fichier source sans le réactiver et faire mon opération de copie.
La plage est assez grande, et j'aimerais gagner en rapidité...
Est ce possible ?
Merci pour votre aide Í  tous
Alf

Bonjour,
| Existe t il un moyen plus rapide
En une ligne de code :
En supposant que le code est écrit dans le fichier contenant la feuille
"Source", ce qui suit, copie les données ainsi que le format des
cellules de la plage "A1:G25" vers les classeur "Destination dans la
feuille "SonMom" Í  partir de la cellule H5
Application.EnableEvents = False
Worksheets("Source").Range("A1:G25").copy _
Workbooks("Destination.xlsm").worksheets("SonNom").range("H5")
Application.EnableEvents = True
Si tu veux copier les données dans formatage
'--------------------
Sub test()
Dim X As Variant
X = Feuil1.Range("A1:C3")
Application.EnableEvents = False
Workbooks("Destination.xlsm").Worksheets("SonNom").Range("G2").Resize(UBound(X,
1), UBound(X, 2)) = X
Application.EnableEvents = True
'--------------------
Dans les 2 cas, c'est très rapide et sans sélection, et cela suppose que
les 2 fichiers sont ouverts.
End Sub

Merci MichD
Je vais tester tout cela.
C'est Application.EnableEventsúlse qui fait que l'on ne soit pas obligé de faire une sélection...?

La commande "Application.EnableEventsúlse ou True" permet de
neutraliser les procédures événementielles que l'on retrouve dans les
modules feuilles ou dans le ThisWorkbook
Exemple :
Dans le module "Feuille", dans la liste déroulante de gauche en haut de
la page blanche, tu as une liste d'événements qui déclenche des macros
automatiquement suite Í  des actions de l'usager.
'------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Se déclenche chaque fois que tu modifies le contenu d'une cellule
Msgbox "Bonjour"
End Sub
'------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Se déclenche chaque fois que tu sélectionnes une nouvelle cellule
Msgbox "Bonsoir"
End Sub
'------------------
Comme je ne sais pas ce que contient ton projetVBA, j'ai ajouté cela
afin de ne pas déclencher ces macros
Attention, ce n'est qu'un exemple, il y en a bien d'autres!
MichD
Avatar
MichD
Le 31/10/21 Í  04:05, Alf a écrit :
Le dimanche 31 octobre 2021 Í  07:37:18 UTC+1, Alf a écrit :
Le samedi 30 octobre 2021 Í  18:22:16 UTC+2, MichD a écrit :
Le 30/10/21 Í  12:11, Alf a écrit :
Le samedi 30 octobre 2021 Í  17:47:49 UTC+2, MichD a écrit :
Le 30/10/21 Í  11:21, Alf a écrit :
Bonjour Í  tous,
Existe t il un moyen plus rapide et autre que "plage.select, plage.copy" et paste dans le fichier cible, pour copier une plage de données d'une feuille d'un classeur ?
Cette manière m'oblige Í  réactiver le fichier source pour sélectionner la plage de données. Et quelque fois le passage d'une fenêtre Excel Í  une autre se passe mal (workbooks("xxx").activate).
Je voudrais, le fichier cible étant actif, récupérer les bonnes valeurs dans le fichier source sans le réactiver et faire mon opération de copie.
La plage est assez grande, et j'aimerais gagner en rapidité...
Est ce possible ?
Merci pour votre aide Í  tous
Alf

Bonjour,
| Existe t il un moyen plus rapide
En une ligne de code :
En supposant que le code est écrit dans le fichier contenant la feuille
"Source", ce qui suit, copie les données ainsi que le format des
cellules de la plage "A1:G25" vers les classeur "Destination dans la
feuille "SonMom" Í  partir de la cellule H5
Application.EnableEvents = False
Worksheets("Source").Range("A1:G25").copy _
Workbooks("Destination.xlsm").worksheets("SonNom").range("H5")
Application.EnableEvents = True
Si tu veux copier les données dans formatage
'--------------------
Sub test()
Dim X As Variant
X = Feuil1.Range("A1:C3")
Application.EnableEvents = False
Workbooks("Destination.xlsm").Worksheets("SonNom").Range("G2").Resize(UBound(X,
1), UBound(X, 2)) = X
Application.EnableEvents = True
'--------------------
Dans les 2 cas, c'est très rapide et sans sélection, et cela suppose que
les 2 fichiers sont ouverts.
End Sub

Merci MichD
Je vais tester tout cela.
C'est Application.EnableEventsúlse qui fait que l'on ne soit pas obligé de faire une sélection...?

La commande "Application.EnableEventsúlse ou True" permet de
neutraliser les procédures événementielles que l'on retrouve dans les
modules feuilles ou dans le ThisWorkbook
Exemple :
Dans le module "Feuille", dans la liste déroulante de gauche en haut de
la page blanche, tu as une liste d'événements qui déclenche des macros
automatiquement suite Í  des actions de l'usager.
'------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Se déclenche chaque fois que tu modifies le contenu d'une cellule
Msgbox "Bonjour"
End Sub
'------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Se déclenche chaque fois que tu sélectionnes une nouvelle cellule
Msgbox "Bonsoir"
End Sub
'------------------
Comme je ne sais pas ce que contient ton projetVBA, j'ai ajouté cela
afin de ne pas déclencher ces macros
Attention, ce n'est qu'un exemple, il y en a bien d'autres!
MichD

Bonjour Í  tous,
(Je suis sous Excel 2007, au travail Excel 2016 je crois)
J'ai testé ton code MichD, mais rien ne se passe. La copie ne se fait pas.
Dans le second test, X reste Vide....
(essai en enlevant Application.EnableEvents qui ne devrait pas gêner, idem. Je n'ai pas de macros relatives aux feuilles)
Mon code doit avoir quelque chose qui empêche la copie...
Une idée ?...
Merci pour vos réponses
Alf

Voici ce que j'ai constaté:
Mon code,
Fichier source ouvert, Ouvre le fichier cible (devient actif)
Copie (...essaie de copier) une plage du fichier source vers un emplacement du fichier cible
--> la copie ne marche pas dans ce sens
Si j'ouvre le fichier cible, je reviens sur la fenêtre du fichier source, et je lance ma macro.
--> la copie fonctionne (le fichier cible n'étant pas activé)
J'aimerais que la copie fonctionne dans le 1er cas.
Dans ce cas, je dois réactiver le fichier source avant de faire la copie (ce que je ne voulais pas) puis réactiver le fichier cible au final.
Je peux utiliser ApplicationScreenUpdating pour supprimer ces allers-retours dans les fenêtres Excel mais s'il y a un autre moyen....
Merci pour votre aide
Alf

Ajoute la référence au classeur source comme ceci :
Source : Remplace "source" par le nom du classeur
o͹ sont les données Í  copier. Même chose pour le nom "Feuille" Í 
remplacer par le nom de l'onglet o͹ sont les données Í  copier
Application.EnableEvents = False
Workbooks("Source).Worksheets("Feuille").Range("A1:G25").copy _
Workbooks("Destination.xlsm").worksheets("SonNom").range("H5")
Application.EnableEvents = True
Si tu veux copier les données dans formatage
'--------------------
Sub test()
Dim X As Variant
X = Workbooks("Source").Worksheets("Feuille").Range("A1:C3")
Application.EnableEvents = False
Workbooks("Destination.xlsm").Worksheets("SonNom").Range("G2").Resize(UBound(X,
1), UBound(X, 2)) = X
Application.EnableEvents = True
MichD
'--------------------
Avatar
MichD
Je t'ai fait un petit exemple :
Un fichier zip contenant 2 classeurs : Classeur1.xlsm et Classeur2.xlsm
Il y a des données dans le classeur1.xlsm
Ouvre les 2 classeurs et Í  partir du classeur 2, appelle Í  tour de rÍ´le
chacune des 2 macros proposées.
Les 2 macros sont dans le classeur1.xlsm.
https://www.cjoint.com/c/KJFpRigLrVF
MichD
Avatar
Alf
Le dimanche 31 octobre 2021 Í  21:00:59 UTC+1, MichD a écrit :
Bonjour,
Place les 2 classeurs dans le même répertoire
Ouvre le classeur1.xlsm
Exécute la macro.
Dans le module, j'ai commenté le code, je ne suis pas sÍ»r que c'est
suffisant pour ta compréhension...mais c'est le mieux que je peux faire
dans un groupe de discussion.
https://www.cjoint.com/c/KJFt5UuQmIF
MichD

Merci
J'ai compris mon erreur et le reste est clair aussi.
Juste une précision,
Pourquoi utiliser 'Application.Windows("Classeur2.xlsm").Activate au lieu de 'Workbooks("Classeur2.xlsm").Activate ?
qui devraient avoir le même résultat puisqu'il s'agit seulement de passer d'une fenêtre Í  l'autre...
Merci pour ta précision
Alf
Avatar
MichD
Le 01/11/21 Í  03:03, Alf a écrit :
Le dimanche 31 octobre 2021 Í  21:00:59 UTC+1, MichD a écrit :
Bonjour,
Place les 2 classeurs dans le même répertoire
Ouvre le classeur1.xlsm
Exécute la macro.
Dans le module, j'ai commenté le code, je ne suis pas sÍ»r que c'est
suffisant pour ta compréhension...mais c'est le mieux que je peux faire
dans un groupe de discussion.
https://www.cjoint.com/c/KJFt5UuQmIF
MichD

Merci
J'ai compris mon erreur et le reste est clair aussi.
Juste une précision,
Pourquoi utiliser 'Application.Windows("Classeur2.xlsm").Activate au lieu de 'Workbooks("Classeur2.xlsm").Activate ?
qui devraient avoir le même résultat puisqu'il s'agit seulement de passer d'une fenêtre Í  l'autre...
Merci pour ta précision
Alf

Tu peux prendre l'approche que tu veux. En vba comme pour les formules
dans une feuille de calcul, il y habituellement plusieurs manières
d'écrire la même chose. Moi je préfère ceci :
Workbooks("Classeur2.xlsm").Activate
Je te donne un petit exemple, qui retourne le même résultat :
x = ActiveWindow.ActiveSheet.Name
d = Workbooks("Classeur1").ActiveSheet.Name
Moi, je préfère la deuxième ligne de code, elle est plus précise et plus
spécifique, il n'y a pas de place pour une mauvaise interprétation et je
trouve que c'est plus facile Í  lire...C'est une bonne chose de savoir
écrire une ligne de code de différentes manières, dans certaines
situations, cela peut aider!
MichD