Besoin d'aide (concatenation)

Résolu/Fermé
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016 - 18 avril 2016 à 13:53
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016 - 20 avril 2016 à 16:57
Bonjour à tous,



Voila j'ai presque entièrement finis ma macro, le seul soucis c'est l'étape finale.
J'aimerai qu'en fonction du nom de l'onglet il me sélectionne la plage entière et qu'il la colle dans une feuille "RECAP". J'ai commencé à réaliser un code pouvez-vous me dire si je suis sur la bonne voie ou si je pars dans le mauvais sens ?

Merci d'avance


Sub ConcatenationFeuilles()
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim DL As Long 'déclare la variable DL (Derniere Ligne)
Feuil10.Cells.Clear

For Each O In Sheets 'boucle sur tous les onglets O du classeur
If Not O.Name = "DEBUT" And Not O.Name = "FIN" And Not O.Name = "CORRESPONDANCE" And Not O.Name = "BASE" And Not O.Name = "RECAP" And Not O.Name = "FORMULES" Then 'condition : si l'onglet ne s'appelle pas...'
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne 1 (=A) de l'onglet O
Select Case O.Name 'agit en fonction du nom de l'onglet

Case "STRUCTURE" 'cas
O.Range("A2:L" & DL).Value = Copy 'action
Case "STRUCTURE1" 'cas
O.Range("A2:L" & DL).Value = Copy 'action
Case "STRUCTURE2" 'cas
O.Range("A2:L" & DL).Value = Copy 'action
Case "STRUCTURE3" 'cas
O.Range("A2:L" & DL).Value = Copy 'action
Case "STRUCTURE4" 'cas
O.Range("A2:L" & DL).Value = Copy 'action
End Select 'fin de l'action en fonction du nom de l'onglet O


Et la en gros j'aimerai lui dire pour chaque copy colle moi ça dans la feuille "RECAP"

End If 'fin de la condition
Next O 'prochain onglet de la boucle

3 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
18 avril 2016 à 14:07
Bonjoue Eldyviah, bon jour le forum,

Peut-être comme ça :

Sub ConcatenationFeuilles()

'***************************************************************************************************
'ce code va copier la plage A2:A... jusqu'à DL de chaque onglet dont le nom commence par "STRUCTURE"
'et va la coller dans la première cellule vide de la colonne A de l'onglet "RECAP"
'***************************************************************************************************

Dim O As Worksheet 'déclare la variable O (Onglets)
Dim R As Worksheet 'déclare la variable R (onglet Recap)
Dim DL As Long 'déclare la variable DL (Derniere Ligne)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Feuil10.Cells.Clear  '??
Set R = Sheets("RECAP") 'définit l'onglet R
For Each O In Sheets 'boucle sur tous les onglets O du classeur
    If Left(O.Name, 9) = "STRUCTURE" Then
        DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne 1 (=A) de l'onglet O
        Set DEST = R.Cells(Application.Rows.Count, 1).End(xup).Offset(1, 0) 'définit la cellule de destination DEST (première cellule vide de la colonne 1 (=A) de l'onglet R)
        O.Range("A2:L" & DL).Copy DEST 'copy la plage A2:A... jusqu'à DL de l'onglet O de la boucle et la colle dans DEST
    End If 'fin de la condition
Next O 'prochain onglet de la boucle
End Sub

0
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016
18 avril 2016 à 14:19
Bonjour à toi ThauTheme et encore une fois merci pour ton aide,

Concrètement le code que tu me proposes me parait intéressant cependant le nom de mes feuilles varient et ne suit pas une logique (STUCTURE,STRCUTURE1,...)

Est-ce que par hasard l'utilisation d'un else pourrais me permettre de sélectionner les autre cas ?

Si oui comment faire pour que la macro ne colle pas sur la plage déjà collée par la partie de code précédente

Merci d'avance
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
18 avril 2016 à 14:43
Bonjour,

Peut-être :
Sub ConcatenationFeuilles()
Dim w As Worksheet  'feuille
Dim r As Range      'plage à copier
Dim c As Range      'cellule de destination
Dim n As String     'nom des feuilles à copier
  Feuil10.Cells.Clear
  Set c = Feuil10.Range("A2")
  n = "/STRUCTURE/STRUCTURE1/STRUCTURE2/STRUCTURE3/STRUCTURE4/"
  For Each w In Worksheets
    With w
      If InStr(1, n, "/" & w.Name & "/") > 0 Then
        With .Range(.Cells(.Rows.Count, "A").End(xlUp), "L2")
          .Copy c
          Set c = c.Offset(.Rows.Count)
        End With
      End If
    End With
  Next w
End Sub

0
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016
18 avril 2016 à 15:04
Merci Patrice,

Il y a deux points sur lesquels j'aimerais que tu éclaircisses mon esprit, si tu le veux bien:
Premièrement -> Feuil10.Range("A2") pourquoi ("A2")
Deuxièmement ->Je comprends pas le code à partir de if

Merci d'avance
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
Modifié par Patrice33740 le 18/04/2016 à 15:38
Re,

Premièrement :
Tu n'as pas précisé où tu veux copier tes données, tu peux les mettre ailleurs.

Deuxièmement :
InStr(1, n, "/" & w.Name & "/") > 0
permet de vérifier que le nom de la feuille, se situe dans la liste des noms avec un / devant et un / derrière pour être sur de tester le nom exact.

.Range(.Cells(.Rows.Count, "A").End(xlUp), "L2")
définit la plage de cellules depuis la dernière ligne de la colonne A jusqu'à L2 (les 2 diagonales définissent la même plage !)

.Copy c
copie la plage vers la cellule c

Set c = c.Offset(.Rows.Count)
Définit la prochaine cellule de destination (décalée vers la bas en fonction du nombre de lignes de la plage copiée)

Edit : Pour obtenir l'aide VBA sur un mot : places le curseur dessus et tapes F1
0
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016
18 avril 2016 à 16:01
Merci pour les précisions,

Je vais donc t'éclairer pour que tu puisses m'aider correctement alors =)

Je veux copier les valeurs et les mettre dans la feuille recap

Je viens de comprendre merci pour cette indication, concernant le test exact du nom, ça pourra me servir de nouveau dans mes futurs macros.

Pour Set c = c.Offset(.Rows.Count) j'ai un bug d'exec (1004)

Merci pour l'info je m'en servirai à l'avenir
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
18 avril 2016 à 18:49
Le bug, avec quel code exactement (code complet) ?
0
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016
19 avril 2016 à 09:48
Bonjour Patrice,

Le code que vous m'avez transmis je l'ai adapté en fonction des informations que j'ai besoin de traiter et ça me met un bug d'exec à chaque fois est-ce normal ou est-ce moi qui ait fait une fausse manip ?
0
Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
18 avril 2016 à 16:03
Bonjour,

Copy c'est ce que tu veux faire?
0
Eldyviah Messages postés 30 Date d'inscription mercredi 13 avril 2016 Statut Membre Dernière intervention 20 avril 2016
18 avril 2016 à 16:08
Re,

Oui c'est ce que j'aimerai faire
0