Définir des plages en VBA pour copier/coller dasn autre classeur

Jacques25

XLDnaute Occasionnel
Bonjour à tous,

Afin de simplifier un code je souhaiterai savoir s'il est possible de définir des plages dans une feuille pour les coller en une seule fois dans un autre classeur. Sachant que j'ai 5 plages non contigüe à coller dans un ordre différents.

Actuellement à chaque plage je passe d'un fichier à l'autre avec :

dl = ActiveSheet.Range("D5000").End(xlUp).Row

ActiveSheet.Range("C3:D" & dl).Copy

Windows("toto.xls").Activate
Range("M2").Select
ActiveSheet.Paste

windows("toto2.xls).activate
ActiveSheet.Range("H3:H" & dl).Copy

Windows("toto.xls").Activate
Range("B2").Select
ActiveSheet.Paste

...

J'imagine quelque chose de la sorte (ne vous arrachez pas les cheveux, c'est juste une idée, un croquis de ce que je souhaiterai):

nom = ActiveSheet.Range("C3:D" & dl)
numero = ActiveSheet.Range("H3:H" & dl)
...

nom.copy
numero.copy

windows("toto").activate

Range("M2").Select
ActiveSheet.Paste (il faudrait copier nom)

Range("B2").Select
ActiveSheet.Paste (il faudrait copier Numero)

J'espère que c'est assez clair même si ça neressemble à rien et que quelqu'un pourra m'aider.

Bonne journée.

Jack
 

stefan373

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour jacques25 et le forum,

Pour sélectionner plusieurs plages non contiguës, vous pouvez utiliser la méthode Union et Range. :)

Code:
Dim plages As Range
Set plages = Union(Range("A1:A5"), Range("C2:D7"))
plages.Select

A + Stéfan
 

Dranreb

XLDnaute Barbatruc
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour.
Pour copier/coller des plages vous n'avez jamais besoin d'activer ni de sélectionner quoi que ce soit:
ExpressionRangeSource.Copy Destination:=ExpressionRangeCible
ExpressionRangeSource et ExpressionRangeCible doivent être des expressions Range définies d'une des façons suivantes par ordre décroissant de préférences dans ce qui est possible selon le contexte:
- Une variable déclarée As Range convenablement initialisée préalablement par un Set,
- ExpressionWorksheet.[AddresseOuNom]
- ExpressionWorksheet.[AdrCelDép].Resize(NbrLgn, NbrCol))
- ExpressionWorksheet.Range(ExpressionStringAddresseOuNom)
- ExpressionWorksheet.Cells(LgnDépart, ColDépart).Resize(NbrLgn, NbrCol))
- ExpressionWorksheet… Il y a quelques autres façons d'isoler une expression Range d'une feuille, je ne vais pas essayer de les énumérer toutes, j'en oublierais certainement.
Avec ExpressionWorksheet, par ordre décroissant de préférences dans ce qui est possible selon le contexte :
- Le mot clé Me si le code est écrit dans le module associé à la feuille concernée,
- Le CodeName de la feuille du classeur portant le projet VBA contenant ce code,
- Une variable déclarée As Worksheet convenablement initialisée préalablement par un Set,
- ActiveSheet pour la feuille active du classeur actif,
- ExpressionWorkbook.Worksheets(NomOuIndex)
Avec ExpressionWorkbook, par ordre décroissant de préférences dans ce qui est possible selon le contexte :
- ActiveWorkbook pour le classeur actif,
- Une variable déclarée As Workbook convenablement initialisée préalablement par un Set,
- Workbooks(NomOuIndex)
- ThisWorkbook pour le classeur portant le projet VBA contenant ce code, mais dans ce cas, puisqu'il s'agit d'en prendre une feuille, autant en prendre le CodeName (c'est le nom de constante Worksheet figurant dans la rubrique "Microsoft Excel Objets" à gauche du nom Excel de la feuille rappelé entre parenthèses)
À +
 
Dernière édition:

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour Stephan, Dranreb, le forum,

Merci pour vos conseils que je souhaite exploiter et donc comprendre.

Pour la méthode de Stephan je pense qu'il faut que je crée plusieurs plage étant donné quelles ne sont pas pas contigües pour pouvoir les coller plus tard mais je ne vois pas trop la syntaxe.

Pour la méthode de Dranreb, j'ai écris ça mais ça ne marche pas (au départ j'avais mis Thisworkbook à la place de Workbooks("toto.xls") mais ça ne marchait pas:

Sub Macro3()
Dim Plage1, Plage2, plage3, plaged1, plaged2, plaged3 As Range

dl = Workbooks("toto.xls").Range("A5000").End(xlUp).Row

Set Plage1 = Workbooks("toto.xls").Range("H2:H" & dl)
Set Plage2 = Workbooks("toto.xls").Range("I2:I" & dl)
Set plage3 = Workbooks("toto.xls").Range("E2:E" & dl)
Set plaged1 = Workbooks("classeur2.xlsx").Range("A2")
Set plaged2 = Workbooks("classeur2.xlsx").Range("C2")
Set plaged3 = Workbooks("classeur2.xlsx").Range("D2")

Plage1.Copy destinastion:=plaged1
Plage2.Copy destinastion:=plaged2
plage3.Copy destinastion:=plaged3
End Sub

Pouvez vous me renseigner.

Merci à tous.
Bonne journée

Jacques
 

Dranreb

XLDnaute Barbatruc
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour.
Le type de donnée doit être déclaré derrière chaque variable dans un Dim, faute de quoi Variant est assumé. Donc là seul plaged3 est As Range, tous les autres PLag… qui précèdent se retrouvent As Variant.
Range n'est pas une méthode de l'objet Workbook. Il manque probablement Worksheets(QuelqueChose) entre les deux pour que ça forme une expression Worksheet. Plutôt que de 6 variables As Range, pour éviter 6 recherches dans la collection Workbooks avec à chaque fois une recherche dans la collection Worksheets du classeur, vous auriez à priori plutôt besoin de deux variables déclarées As Worksheet, à moins qu'une des deux soit dans le classeur qui porte la macro. Alors pour celle ci vous pouvez directement utiliser le nom VBA de la feuille.
Il y a un "s" en trop dans "destinastion".
À +
 
Dernière édition:

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Re,

Merci de m'aider c'est vraiment sympa. Voici la correction qui marche pour ceux qui pourrait lire ce fil :

Reste encore une petite question à la fin...

Sub Macro3()
Dim Plage1 As Range, Plage2 As Range, plage3 As Range, plaged1 As Range, plaged2 As Range, plaged3 As Range

dl = Workbooks("toto.xls").Sheets("T1").Range("A5000").End(xlUp).Row

Set Plage1 = Workbooks("toto.xls").Sheets("T1").Range("H2:H" & dl)
Set Plage2 = Workbooks("toto.xls").Sheets("T1").Range("I2:I" & dl)
Set plage3 = Workbooks("toto.xls").Sheets("T1").Range("E2:E" & dl)
Set plaged1 = Workbooks("classeur2.xlsx").Sheets("Feuil1").Range("A2")
Set plaged2 = Workbooks("classeur2.xlsx").Sheets("Feuil1").Range("C2")
Set plaged3 = Workbooks("classeur2.xlsx").Sheets("Feuil1").Range("D2")

Plage1.Copy Destination:=plaged1
Plage2.Copy Destination:=plaged2
plage3.Copy Destination:=plaged3

End Sub


Question :

Quelle syntaxe pour éviter de répéter à chaque fois "Workbooks("toto.xls").Sheets("T1")" ?

Encore merci pour ton aide.

Jacques
 

Dranreb

XLDnaute Barbatruc
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Si la macro ne figure dans aucun des deux classeurs impliqués, la meilleure écriture à mon sens serait:
VB:
Sub Macro3()
Dim FSource As Worksheet, FCible As Worksheet, NbL As Long
Set FSource = Workbooks("toto.xls").Worksheets("T1")
Set FCible = Workbooks("classeur2.xlsx").Worksheets("Feuil1")
NbL = FSource.[A5000].End(xlUp).Row - 1
FSource.[H2].Resize(NbL).Copy Destination:=FCible.[A2]
FSource.[I2].Resize(NbL).Copy Destination:=FCible.[C2]
FSource.[E2].Resize(NbL).Copy Destination:=FCible.[D2]
End Sub
On utilise donc ainsi ma combinaison:
- ExpressionWorksheet.[AdrCelDép].Resize(NbrLgn, NbrCol)
Avec ExpressionWorksheet :
- Une variable déclarée As Worksheet convenablement initialisée préalablement par un Set.

Sinon, voir à utiliser de préférence le nom de code connu de VBA de cette feuille à la place de la variable Worksheet. Ces noms, indiqués dans la rubrique "Microsoft Excel Objets" sont en somme des constantes Worksheet qui ne nécessitent plus d'initialisation.
Cordialement.
 
Dernière édition:

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Salut Dranreb, le forum,

Désolé pour la réponse tardive, des ptits soucis de famille...
Merci pour ta réponse, je vais pouvoir simplifier mon code.

Bonne journée à tous;

Jacques
 

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour Dranreb, le forum,

J'ose abuser de tes coup de mains ou de celui des autres membres pour une dernière question sur le sujet :

Quelle serait la syntaxe pour copier uniquement les valeurs (pour la ligne ci dessous par exemple)?

FSource.[E2].Resize(NbL).Copy Destination:=FCible.[D2]

Merci à tous votre aide sur le forum, c'est cool.

Jacques
 

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Re,

C'est encore moi, je me suis fais jeté mais 'ai compris pourquoi, j'avais pas lu correctement le code. Ca fonctionne sauf que j'ai un soucis en fait je viens faire un copier/coller d'une colonne filtrée (j'enlève les #N/A) pour les coller à la suite d'une liste.
Mon code est le suivant :

Cible1.Range("I" & dl3).Resize(dl2).Value = Source1.[H2].Resize(dl2).Value

Les données sont bien dupliquée mais avec les #N/A.

Une idée?

Merci et désolé d'abuser
Jacques
 

Jacques25

XLDnaute Occasionnel
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Salut Dranreb, le forum,

J'ai essayé cette solution mais le résultat n'est pas bon, je n'ai plus les #N/A une fois le collage effectué mais j'ai des vide. Je pourrais supprimer ces vides par la suite mais le reste ne suivrai pas.
Pour l'instant mon code marche, je voulais juste essayer de la simplifier pour accélérer son fonctionnement. Si ce n'est pas possible je ferai avec.

Bonne journée à tous et encore merci pour votre aide quotidienne à tous.

@ plus
Jacques
 

Dranreb

XLDnaute Barbatruc
Re : Définir des plages en VBA pour copier/coller dasn autre classeur

Bonjour
Pour supprimer les lignes entières où il y a les #N/A dans la colonne I plutôt que les effacer ce serait:
VB:
Cible1.Cells(dl3, "I").Resize(dl2).SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete
Cordialement.
 

Discussions similaires

Statistiques des forums

Discussions
312 519
Messages
2 089 266
Membres
104 083
dernier inscrit
hecko