VBA concatener 12 onglets successifs seulement (sur 17 onglets)

[Résolu/Fermé]
Signaler
Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015
-
Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015
-
Bonjour,

je souhaite creer une macro concatenant 12 onglets successifs dans un premier onglet qui sera creee au debut du fichier. J'avais utilise cela:

Sheets.Add Before:=Sheets(1)
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
Range("D36:P:36").PasteSpecial Paste:=xlPasteValues
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Next Ws

J'ai du mal a arreter la macro a l'onglet #12. Je suis preneuse de vos idees.

Merci a tous

6 réponses

Bonjour

peut-être comme ceci, si selection correspond à quelque chose
Dim Ws As Worksheet, Concat as worksheet
Sheets.Add Before:=Sheets(1)
Sheets(1).Name="Concaténation"
set Concat=worksheets("Concaténation")

For i=2 to 12 ' N° de feuilles
Worksheets(i).Range(Selection, Selection.End(xlDown)).Copy
Concat.Range("D36:P:36").PasteSpecial Paste:=xlPasteValues
Next


A+
Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015

Merci beaucoup Paf,

tu as raison ma "selection" ne marche pas correctement. En fait je designe la premiere ligne d'un tableau et lui demande d'aller selectionner jusqu'a la derniere ligne mais il s'arrete en cours de route car certaines cellules sont vides.
Je fais face a un nouveau defi et j'ai imagine 3 solutions:
- remplir les cellules vides avec des tirets en faisant un go to special -> blank mais cela voudrait dire que j'arrive a selectionner la zone appropriee
- Selectionner ma premiere colonne (A1:A43) dont toutes cellules sont remplies et etendre aux colonnes de droites jusqu'a P43.
- Trouver une solution pour selectionner la zone malgre les blancs.

Si tu as une piste pour moi, je suis preneuse. J'ai deja regarde pas mal de Tuto mais je n'ai pas trouve de solutions qui me conviennent.

Si je ne suis pas claire je peux t'envoyer un fichier ou m'expliquer plus intelligiblement

Merci beaucoup,
Daphne
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
154
Bonsoir le fil, bonsoir le forum,
Peut-être comme ça :

Sub Macro1()
Dim I As Byte 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Sheets.Add Before:=Sheets(1) 'ajoute un onglet en première position
For I = 2 To 13 'boucle sur les onglets 2 à 13
    With Sheets(1) 'prend en compte le premier onglet
        'définit la cellule de destination DEST (A1 si A1 est vide, sinon, la première cellule vide
        'de la colonne 1 (=A) du premier onglet)
        Set DEST = IIf(.Range("A1").Value = "", .Range("A1"), .Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
    End With 'fin de la prise en compte du premier onglet
    Sheets(I).Range("D36").CurrentRegion.Copy DEST 'copy la plage de l'onglet I et la colle dans DEST
Next I 'prochian onglet de la boucle
End Sub



Re

il s'arrête en cours de route à cause de l'emploi de xlDown qui s'arrête à la première ligne vide rencontrée.
L'emploi de xlUp démarre par la fin de colonne et s'arrête à la première ligne renseignée rencontrée. à utiliser de préférence pour déterminer la dernière ligne remplie d"une colonne (A dans l'exemple), malgré des cellules vides intermédiaires:

DerLig = Range("A" & Rows.Count).End(xlUp).Row (en précisant la feuille si nécessaire)

pour sélectionner les colonnes A à P jusqu'à la dernière ligne renseignée:
Worksheets(i).Range("A1:P" & DerLig).Copy 

ou
Worksheets(i).Range("A1:P" & Worksheets(i).Range("A" & Rows.Count).End(xlUp).Row).Copy 


A+
Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015

C'est parfait. MERCI beaucoup.
Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015

Bonsoir,

Voila mon code, modifie grace a votre aide (sans le debut ou je cree l'onglet et le nomme)

' Selection la zone a copier dans les 12 onglets et la copie dans l'onglet concatenation
For I = 2 To 10 ' N° de feuilles
With Sheets(1) 'prend en compte le premier onglet
'définit la cellule de destination DEST (C2 si C2 est vide, sinon, la première cellule vide de la colonne 3 (=C) du premier onglet)
Set DEST = IIf(.Range("C2").Value = "", .Range("C2"), .Cells(Application.Rows.Count, 3).End(xlUp).Offset(1, 0))
End With 'fin de la prise en compte du premier onglet
Worksheets(I).Range("D37:P" & Worksheets(I).Range("D" & Rows.Count).End(xlUp).Row).Copy DEST
Next I 'prochain onglet de la boucle

C'est absolument parfait, merci beaucoup.
Une derniere question, est-il possible de coller en collage special? En effet, j'aimerais coller en gardant le format des nombres ce serait plus pratique pour mes donnees.

Merci beaucoup.
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
154
Bonsoir le fil, bonsoir le forum,

Remplace la ligne:

Worksheets(I).Range("D37:P" & Worksheets(I).Range("D" & Rows.Count).End(xlUp).Row).Copy DEST

par (format à adapter) :

Worksheets(I).Range("D37:P" & Worksheets(I).Range("D" & Rows.Count).End(xlUp).Row).Copy
DEST.PasteSpecial (xlPasteFormats)
Application.CutCopyMode = False

Messages postés
8
Date d'inscription
vendredi 27 février 2015
Statut
Membre
Dernière intervention
18 août 2015

Bonjour,
merci beaucoup pour votre aide!!!!!!