IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copier plusieurs feuilles en une seule, avec mis à jour auto [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Copier plusieurs feuilles en une seule, avec mis à jour auto
    Bonjour à tous et à toutes,

    Je suis nouveau sur ce forum, et après un grand nombre de recherches infructueuses , je viens vous demander de l'aide.

    Mon objectifs est simple: J'ai 12 feuilles, qui contiennent chacune un même tableau avec un même nombre de colonne. Seul, le nombre de ligne varie en fonction de chaque tableau. Ce que je souhaites, c'est une macro que je mettrais dans ma feuille synthese qui fera la structure suivante:

    Feuille1
    ligne 1 à 50
    Feuille2
    Ligne 51 à 101
    Feuille3
    Ligne 102 à 302
    ....
    Feuille 12
    Ligne x à y

    Le nombre de ligne de chaque onglet est suceptible de varier. Du coup, j'aimerais qu'en cliquant sur l'onglet synthese, le tableau se mette de nouveau à jour. Donc en cliquant dessus, j'obtiendrais par exemple:

    Feuille1
    ligne 1 à 60
    Feuille2
    Ligne 61 à 111
    Feuille3
    Ligne 112 à 352
    ....
    Feuille 12
    Ligne x à y

    Merci d'avance, et si besoin, je vous prépare un fichier exemple, si ce n'est pas très clair.

    Cordialement,

    Alexandre

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub Synth()
    Dim LastLig As Long, NewLig As Long
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        .UsedRange.Clear
        NewLig = 1
        For Each Ws In ThisWorkbook.Worksheets
            If Ws.Name <> "Synthese" Then
                LastLig = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
                Ws.Rows("1:" & LastLig).Copy .Range("A" & NewLig)
                NewLig = NewLig + LastLig
            End If
        Next Ws
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Amelioration
    Merci beaucoup pour avoir pris le temps de me répondre,

    Je me demandais s'il était possible de ne jamais ajouter la premiere ligne, donc de commencer à la ligne A2, et que A1 soit fixe, puisqu'elle est commune sur chaque feuille, et de ne pas faire de saut de ligne entre chaque feuille. J'ai fait plusieurs essais mais cela ne marche jamais.

    Merci beaucoup,

    Cordialement,

    Alexandre

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je me demandais s'il était possible de ne jamais ajouter la premiere ligne, donc de commencer à la ligne B
    Tu parles de lignes ou de colonnes. je ne connais pas de ligne B
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Je parle bien de ligne, je voudrais que ça commence à la ligne A2, et qu'il n'y ait pas de saut de ligne entre chaque feuille.

    Je pensais avoir corrigé mon erreur entre ligne et colonne.

    Merci d'avance,

    Cordialement,

    Alexandre

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Synth()
    Dim LastLig As Long, NewLig As Long
    Dim Ws As Worksheet
    Dim Deb As Byte
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        .UsedRange.Clear
        NewLig = 1
        For Each Ws In ThisWorkbook.Worksheets
            If Ws.Name <> "Synthese" Then
                LastLig = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
                Deb = IIf(NewLig = 1, 1, 2)
                Ws.Rows(Deb & ":" & LastLig).Copy .Range("A" & NewLig)
                NewLig = NewLig + LastLig
            End If
        Next Ws
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup une fois de plus pour le temps que vous m'avez consacré. Je ne sais pas si c'est normal, mais la derniere macro fait ce qu'il faut, c'est à dire sans saut de ligne et en partant de A2. A la toute fin, il y a un saut de ligne, et de nouveau la macro recopie en double mais cette fois ci en sautant une ligne entre chaque feuille.

    Je voulais également savoir s'il était possible d'activer la macro au moment ou je cliquerais sur la feuille.

    Merci beaucoup,

    Cordialement,

    Alexandre

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    En effet, il y avait décalage.
    Sinon, pour chaque activation de la feuille synthèse, on va utiliser l'évènement Activate de cette feuille.

    Code modifié à mettre dans le module de la feuille de synthèse (Ici pour l'exemple elle nommée Synthese)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Worksheet_Activate()
    Dim LastLig As Long, NewLig As Long
    Dim Ws As Worksheet
    Dim Deb As Byte
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        .UsedRange.Clear
        NewLig = 1
        For Each Ws In ThisWorkbook.Worksheets
            If Ws.Name <> "Synthese" Then
                LastLig = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
                Deb = IIf(NewLig = 1, 1, 2)
                Ws.Rows(Deb & ":" & LastLig).Copy .Range("A" & NewLig)
                NewLig = NewLig + LastLig + 1 - Deb
            End If
        Next Ws
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut MERCI
    Bonjour,

    Merci beaucoup, c'est parfait. J'ai une dernière question et après je vous laisse tranquil . Quelle partie de la macro dois je modifier si je veux exclure certaines feuilles ?

    Merci beaucoup,

    Cordialement,

    Alexandre

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Remplace la ligne 11 du code par celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            If InStr("Synthese|Feuil1|Feuil24|", Ws.Name & "|") = 0 Then ' entre "" mettre le nom de toutes les feuilles à exclure séparés d'un |
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut MERCI de nouveau
    Merci, je venais de trouver par mes propres moyens, mais votre solution est plus jolie que la mienne.

    Je viens d'observer un détail. La macro supprime systématiquement ma ligne 1dans synthese. Or c'est la ligne ou il y a mes titres de colonnes, et donc qui ne varie jamais. C'est pour ça que je voulais que la macro commence en ligne 2, puisque les titres de synthese et de mes autres onglets sont les mêmes. J'ai vu UsedRange.Clear, et j'ai essayer de bidouiller un peu mais le résultat est catastrophique.

    Désolé de vous prendre encore du temps

    Merci d'avance,

    Cordialement,

    Alexandre

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu as dis que partout tu as le même titre.
    Je vais expliquer le code:
    1. Efface toutes les données de la feuille Synthèse
    2. Boucle sur toutes les feuilles (sauf certaines)
    3. Copie les données de la première feuille (y compris la ligne 1 des titres)
    4. Copies les données des autres feuilles en commençant par la 2ème ligne des ces feuilles (pour ne pas répéter les titres à la suite des données de la feuille précédente dans la feuille Synthèse).

    Sinon, pour ne pas toucher la ligne des titres de la feuille Synthèse, ci-joint code modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub Worksheet_Activate()
    Dim LastLig As Long, NewLig As Long
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        If LastLig > 1 Then .Rows(2 & ":" & LastLig).Clear
        NewLig = 2
        For Each Ws In ThisWorkbook.Worksheets
            If InStr("Synthese| Feuil1| Feuil24|", Ws.Name & "|") = 0 Then    ' entre "" mettre le nom de toutes les feuilles à exclure séparés d'un |
                LastLig = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
                Ws.Rows("2:" & LastLig).Copy .Range("A" & NewLig)
                NewLig = NewLig + LastLig -1
            End If
        Next Ws
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Merci énormément pour ton aide, et le temps que tu as consacré pour m'aider. Merci également pour tes explications. La macro marche parfaitement.


    Cordialement,

    Alexandre

    Je suis désolé de t'importuner de nouveau, mais je viens d'apprendre que la structure du tableau commune à tous mes onglets est suceptible de varier en nombre de colonnes.

    La, la structure du tableau va jusqu'en AO, mais si je créer une nouvelle colonne dans chacun de mes onglets, la synthèse ne les prend pas en compte ...

    Merci par avance

    Cordialement,

    Alexandre

    J'ai bidouiller ta macro. J'ai bien mes valeurs qui s'ajoutent quand j'ajoute une colonne. Il y'a seulement le titre qui ne s'ajoute pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub Worksheet_Activate()
    Dim LastLig As Long, NewLig As Long
    Dim LastCol As Long, NewCol As Long
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        If LastLig > 1 Then .Rows(2 & ":" & LastLig).Clear
        NewLig = 2
        LastCol = .Cells(.Rows.Count, "A").End(xlToRight).Row
        If LastCol > 1 Then .Rows(2 & ":" & LastCol).Clear
        NewCol = 2
        For Each Ws In ThisWorkbook.Worksheets
            If InStr("Synthese| SBC| TCD| GCD| Matières|", Ws.Name & "|") = 0 Then    ' entre "" mettre le nom de toutes les feuilles à exclure séparés d'un |
                LastLig = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
                Ws.Rows("2:" & LastLig).Copy .Range("A" & NewLig)
                NewLig = NewLig + LastLig - 1
                LastCol = Ws.Cells(Ws.Rows.Count, 1).End(xlToRight).Row
            End If
        Next Ws
    End With
    End Sub

  14. #14
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ci-joint code plus complexe qui permet de copier colonne par colonnes les données de chaque feuille vers la colonne correspondante dans synthèse.
    ceci est généralisé pour pallier à 2 risques:
    1. l'ordre des colonnes n'est pas respecté entre les feuilles
    2. absence dans synthèse d'une colonne

    Le code ci-après permet de:
    1. Effacer les données de la feuille Synthèse (à partir de la ligne 2)
    2. faire une boucle sur certaines feuilles
    3. au sein de chaque feuille, boucler sur toutes les colonnes C
    4. cherche la position P du titre de la colonne C au sein de la feuille Synthèse
    5. si le titre de la colonne C est trouvé dans la 1ère ligne de la feuille Synthèse, il copie les données de la colonne C vers la colonne P de la feuille Synthèse
    6. si le titre de la colonne C n'est pas trouvé dans la 1ère ligne de la feuille Synthèse, il ajoute le nouveau titre dans la première colonne libre et y copie les données de la colonne C
    7. boucle sur la colonne suivante
    8. boucle sur la feuille suivante

    PS: Les titres doivent être partout écrits identiquement (sinon, le code va les considérer différents)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Private Sub Worksheet_Activate()
    Dim LastLig As Long, NewLig As Long
    Dim LastCol As Integer, i As Integer
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    With Worksheets("Synthese")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        If LastLig > 1 Then .Rows(2 & ":" & LastLig).Clear
        NewLig = 2
        For Each Ws In ThisWorkbook.Worksheets
            If InStr("Synthese|Feuil24|Feuil15|", Ws.Name & "|") = 0 Then    ' entre "" mettre le nom de toutes les feuilles à exclure séparés d'un |
                With Ws
                    LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
                    If LastLig > 1 Then
                        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
                        For i = 1 To LastCol
                            Call Transfert(.Name, i, NewLig)
                        Next i
                        NewLig = NewLig + LastLig - 1
                    End If
                End With
            End If
        Next Ws
    End With
    End Sub
     
    'Procédure qui permet de tansferer chaque colonne vers la colonne dont le titre correspond dans la feuille synthèse
    'Si le titre n'existe pas dans synthèse, elle le crée à la fin des colonne et y transfert les données
    Private Sub Transfert(ByVal ShName As String, ByVal Col As Integer, ByVal NewLig As Long)
    Dim c As Range
    Dim Titre As String
    Dim LaCol As Integer
    Dim Ws As Worksheet
    Dim LastLig As Long
     
    With Worksheets(ShName)
        Titre = .Cells(1, Col).Value
        If Titre <> "" Then
            Set Ws = Worksheets("Synthese")
            Set c = Ws.Rows(1).Find(Titre, LookIn:=xlValues, Lookat:=xlWhole)
            If Not c Is Nothing Then
                LaCol = c.Column
                Set c = Nothing
            Else
                LaCol = Ws.Cells(1, Ws.Columns.Count).End(xlToLeft).Column + 1
                Ws.Cells(1, LaCol).Value = Titre
            End If
            LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
            .Range(.Cells(2, Col), .Cells(LastLig, Col)).Copy Ws.Cells(NewLig, LaCol)
            Set Ws = Nothing
        End If
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Merci Enormément
    Bonjour,

    Désolé d'avoir tarder pour te répondre. Merci pour ton travail, tes explications et ta patience. C'est exactement ce que je souhaitais, et je n'aurais jamais réussi sans ton aide.

    Cordialement,

    Alexandre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Copier plusieurs feuilles dans une seule
    Par RussellD dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/09/2010, 15h20
  2. Récapitulatif de plusieurs feuilles dans une seule
    Par Elumastebit dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 04/12/2008, 19h11
  3. Import de tableaux de plusieurs feuilles dans une seule
    Par Jibicas dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 22/04/2008, 08h40
  4. import de données de plusieurs feuilles dans une seule
    Par naevus dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 10/01/2008, 13h32
  5. copier des plages variables de plusieurs feuilles vers une seule
    Par irene15 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 22/06/2007, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo