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 coller données depuis plusieurs feuilles avec correspondance


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Copier coller données depuis plusieurs feuilles avec correspondance
    Bonjour
    mon fichier contient plusieurs feuilles (1 feuille par mois), chaque feuille contien 2 colonnes : colonne A pour l'identité du client et colonne B pour le nombre de commandes rattachées à ce client. la liste des clients d'une feuille à une autre n'est pas forcément la même ( clients en plus ou en moins). je veux faire un feuille globale pour l'année qui permettra de rapatrier les clients dans la colonne A et dans les autres colonnes (B, C, D, ...) les données sur le nombre de commandes rattachées à ce client (colonne B pour le mois 1, colonne C pour le mois 2,...).
    si absence de données pour un client à un mois donné : mettre Zéro dans la cellule. voici fichier joint pour illustrer ma demande.
    Comment faire.
    Merci pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Issmino, bonjour le forum,

    Peut-être comme ça :

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    Sub Macro1()
    Dim D As Object 'déclare la variable D (Dictionnaire)
    Dim T As Worksheet 'déclare la variable T (onglet Total)
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim COL As Byte 'déclare la variable COL (COLonne)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim TMP As Variant 'déclare la variable TMP (tableau TemPoRaire)
    Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
    Dim PL As Range 'déclare la variable PL (PLage)
    Dim LI As Integer 'déclare la variable LI (LIgne)
     
    '*********************************************
    'récupération des clients et du nombre de mois
    '*********************************************
     
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    Set T = Sheets("total") 'définit l'onglet T
    For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
        If Not O.Name = T.Name Then 'condition : si l'onglet ne se nomme pas "total"
            COL = COL + 1 'incrément la colonne COL
            TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
            For I = 2 To UBound(TC, 1) 'boucle 2 : sur toutes ls lignes I du tableau de cellules TC
                D(TC(I, 1)) = "" 'alimente le dictionnaire D
            Next I 'prochaine ligne de la boucle 2
        End If 'fin de la condition
    Next O 'prochain onglet de la boucle 1
    TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des clients sans doublons
    NC = COL + 2 'définit la nombre de colonnes (donc le nombre de mois)
     
    '*************************************************************************
    'effacement ancien tableau du total, nouvelles étiquettes et mise en forme
    '*************************************************************************
     
    T.Cells.Clear 'efface d'éventuelles anciennes données de l'onglet T
    T.Range("A1").Value = "CLIENT" 'écrit dans A1
    With T.Range(T.Cells(1, 2), T.Cells(1, COL + 2))
        .Merge 'fusionne les cellules A2:A...
        .Cells(1).Value = "NOMBRE COMMANDES" 'ecrit dans la plage fusionné
    End With
    For I = 1 To COL + 1
        T.Cells(2, I + 1).Value = "mois" & I 'écrit moisx dans la cellule de la boucle
    Next I
    T.Cells(2, COL + 2).Value = "Total" 'écrit
    T.Range("A3").Resize(UBound(TMP, 1), 1).Value = Application.Transpose(TMP) 'renvoie la liste des clients (sans doublon) transposée dans la cellule A3
     
    'mise en forme de la plage PL
    Set PL = T.Range("A1").CurrentRegion 'définit la plage PL
    PL.HorizontalAlignment = xlCenter
    Application.Intersect(PL, T.Rows("1:2")).Font.Bold = True
    With PL.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With PL.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With PL.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With PL.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With PL.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With PL.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
     
    '*********************************************
    'dispacthing des données dans le tableau total
    '*********************************************
     
    COL = 2 'redéfinit la colonne COL
    For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
        If Not O.Name = T.Name Then 'condition : si l'onglet ne se nomme pas "total"
            TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
            For I = 2 To UBound(TC, 1) 'boucle 2 : sur toutes ls lignes I du tableau de cellules TC
                On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
                LI = T.Columns(1).Find(TC(I, 1), , xlValues, xlWhole).Row 'définit la ligne LI (génère une erreur si le client n'existe pas)
                If Err <> 0 Then Err = 0: GoTo suite 'si une erreur a été générée, efface l'erreur, va a l'étiquette "suite"
                T.Cells(LI, COL) = TC(I, 2) 'renvoie la valeur du client dans le mois correspondant du tableau total
    suite: 'étiquette
            Next I 'prochaine ligne de la boucle 2
            COL = COL + 1 'incrémente la colonne COL
        End If 'fin de la condition
    Next O 'prochain onglet de la boucle 1
     
    'mise en place des formules de Somme
    For I = 3 To UBound(TMP, 1) + 2
        T.Cells(I, NC).Formula = "=SUM(" & T.Range(T.Cells(I, 2), T.Cells(I, NC - 1)).Address & ")"
    Next I
     
    'zéro dans les cellules vides
    For Each cel In PL
        If Not cel.Address = "$A$2" Then
            If IsEmpty(cel) Then cel.Value = 0
        End If
    Next cel
    End Sub
    p.s. on devrai y arriver avec une seule boucle mais je m'emmêle les pinceaux et je n'y arrive pas... Sinon il y a les TCD mais c'est encore pire pour moi...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    vous est-il possible de créer cette macro dans le fichier joint afin de tomber sur le même résultat que celui de la feuille "total".
    Encore merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Issmino, bonjour le forum,

    C'est exactement ce que j'ai fait ! Le code a été élaboré à partir de ton fichier pour avoir le même résultat. La seule chose que je n'ai pas traitée c'est la largeur des colonnes de l'onglet total...
    Il te suffit de copier le code et de le coller dans un module standard (Module1 par exemple). Ça va, ça sera pas trop difficile pour toi ?...

Discussions similaires

  1. [XL-2010] Copier des données depuis plusieurs classeurs vers un classeur de Recap
    Par bdel1724 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/11/2014, 21h14
  2. Réponses: 1
    Dernier message: 10/09/2014, 21h39
  3. [XL-2007] Copier des données sur plusieurs feuilles suivant certains critères
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/09/2014, 20h04
  4. [XL-2007] copier/coller 1plage dans plusieur feuilles
    Par revans dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 27/06/2012, 13h15
  5. copier coller données d'une feuille à une autre
    Par Caps corp dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/01/2008, 10h23

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