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 :

Copie de plusieurs onglets vers un seul


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Par défaut Copie de plusieurs onglets vers un seul
    Bonjour à tous,

    je sais que la question a déja été quelque fois posée mais après avoir essayé de récupérer les solutions proposées ici ou sur d'autres forum, je sèche...

    Je vous expose mon pb :

    J'ai plusieurs onglets dont le nombre de colonnes est fixe. Les entêtes de colonnes sont identiques, mais le nombre de lignes est variable.

    J'aimerai que ma macro puisse récupérer le contenu du tableau de chaque onglet (sans copier la première ligne qui est à chaque fois la ligne des intitulés de colonne) et le copier/compiler à la suite dans un onglet synthèse.

    Merci d'avance pour votre aide !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à adapter à ton contexte.Comme il y a une macro il faudra sauver ton fichier en xlsm ou xlsb.
    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
    Option Explicit
     
    Sub ConcatenationFeuilles()
    Dim i As Long, T() As Variant
     
        Application.ScreenUpdating = False
        ShConcat.Cells.Clear
     
        ' Copie En-Tête
        ' Au cas ou la feuille de synthèse se trouverait en 1ere position
        For i = 1 To Worksheets.Count
            If Worksheets(i).Name <> ShConcat.Name Then
                With Worksheets(i)
                    T = .Range("A1:P1").Value
                    ShConcat.Range("A1").Resize(UBound(T, 1), UBound(T, 2)) = T
                End With
                Exit For
            End If
        Next i
     
        '   Copie des données
        For i = 1 To Worksheets.Count
            If Worksheets(i).Name <> ShConcat.Name Then
                With Worksheets(i)
                    T = .Range("A2:P" & .Range("A" & Rows.Count).End(xlUp).Row).Value
                    ShConcat.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(UBound(T, 1), UBound(T, 2)) = T
                End With
            End If
        Next i
        Erase T
        Application.ScreenUpdating = True
    End Sub
    ShConcat étant le CodeName de la feuille "synthèse"
    Pour le CodeName voir ici
    Les avantages du CodeName étant que l'utilisateur peut changer le nom d'onglet des feuilles, ajouter des feuilles ou en déplacer sans avoir à retoucher au code VBA.

  3. #3
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonsoir sebizar,

    Je te propose un code beaucoup plus long que celui de kiki29.
    Plus long mais je le comprend bien

    L'objectif, créer un onglet "TOTAL" (ou synthèse si tu veux l'adapter) :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Sub faitotalonglet()
    '---------------------------------------------------------------------------------------
    'Macro qui copie toutes les lignes (hormis les intitulés de colonne) de tous les onglets
    'et créer un nouvel onglet "TOTAL" composé de l'ensemble des lignes
    '---------------------------------------------------------------------------------------
     
        Dim Fe As Worksheet
        Dim Plage As Range
        Dim t(16) As String
     
        'Initialisation des intitulés de colonne
        t(1) = "CSP"
        t(2) = "N° Formation"
        t(3) = "Intitulé1"
        t(4) = "Intitulé2"
        t(5) = "Objectifs1"
        t(6) = "Objectifs2"
        t(7) = "Moyen_evaluation1"
        t(8) = "Moyen_evaluation2"
        t(9) = "Organisme1"
        t(10) = "Organisme2"
        t(11) = "Début_session1"
        t(12) = "Début_session2"
        t(13) = "Statut"
        t(14) = "Catégorie"
        t(15) = "Nom"
        t(16) = "Prénom"
     
        'Création d'un nouvel onglet TOTAL
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Name = "TOTAL"
     
        'chargement des intitulés de colonne
        For i = 1 To 16
            Cells(1, i).Value = t(i)
        Next
     
        'Mise en forme des intitulés
        Range("A1:P1").Select
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = -0.149998474074526
            .PatternTintAndShade = 0
        End With
        With Selection.Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
        End With
        With Selection
            .HorizontalAlignment = xlCenter
        End With
     
        'Parcours la collection en évitant la feuille "TOTAL"
        For Each Fe In ThisWorkbook.Worksheets
     
            If Fe.Name <> "TOTAL" Then
     
                With Fe
                    'définie la plage sans la ligne de titres
                   Set Plage = .Range(.Cells(2, 1), .Cells(.Cells.Find("*", .[A1], -4123, , 1, 2).Row, .Cells.Find("*", .[A1], -4123, , 2, 2).Column))
                End With
     
                'colle les valeurs dans la feuille "TOTAL"
                'après la dernière ligne non vide
                Plage.Copy Worksheets("TOTAL").Range("A65500").End(xlUp).Offset(1, 0)
     
            End If
     
        Next Fe
     
    End Sub
    Bertrand

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut Bertrand , non seulement plus long mais aussi plus lent

  5. #5
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonjour Kiki29,

    Oui, mon algorithme fonctionne, c'est pour l'instant suffisant pour moi qui apprend à pratiquer le vba en autodidacte
    En terme d'efficacité, je suis bien certain que le tien doit être plus rapide

    Bertrand

    Bonsoir Kiki29,

    Ton code post #2 retient en T le nombre de lignes calculées sur la base de la colonne A. Hors la colonne A peut avoir des zones avec une ou plusieurs cellules vides. Dans la même idée, la colonne A peut être plus "courte" que les autres (courte = avec moins de lignes).

    Mes tests (peut-être que j'ai mal adapté ton code ) me semble me donner raison sur ce point. Est correct de dire que la colonne A ne doit pas avoir de cellule vide pour fonctionner et doit être la colonne la plus grande de toute en nombre d'éléments ?

    Bertrand

  6. #6
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,
    C'est vrai que cela est sous entendu :
    à adapter à ton contexte
    Selon le contexte on pourra utiliser UsedRange, CurrentRegion etc.

    Le problème ici est ailleurs et tu n'as ni modifié ni testé correctement le code.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/09/2013, 13h43
  2. plusieurs table vers une seule table
    Par rrbenez dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 02/09/2009, 21h51
  3. copie de fichiers de plusieurs répertoires vers un seul
    Par cell dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 10/10/2007, 08h39
  4. 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
  5. Réponses: 4
    Dernier message: 14/09/2005, 16h29

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