Répertorier infos plusieurs signets_Excel

Résolu
Bonjour,

Voilà, j'ai un doc excel avec 11signets (11mois). Chaque colonne A de chaque signet répertorie tous les contacts du mois.

J'aimerai, dans un nouveau signet, avoir tous les contacts de tous les signets... Un résumé de l'année en quelque sorte.

Macro? Formule?

Vos aides sont les bienvenues!!

Merci!

20 réponses

Résumé de la discussion

Un document Excel avec 11 feuilles mensuelles réunit les contacts du mois et nécessite la création d’une nouvelle feuille récapitulative, via macro ou formule, pour obtenir un résumé annuel. Des solutions préconisent d’abord totaliser par client pour trois types de palettes afin d’obtenir un top 10, puis d’appliquer une étape intermédiaire pour fusionner les données et éviter les doublons. Plusieurs échanges notent que les doublons résultent d’orthographes variables (majuscules, points) et proposent d'améliorer la macro pour renommer la feuille créée et étendre le calcul à des tops (10 ou 5).

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,
    Si par signet tu sous entends Feuille et que tu n'as pas de feuille nommée "Liste des contacts"
    Alors essayer :
    Option Explicit
    
    Sub Audrey()
    Dim Feuille As Worksheet, TablContacts(), Dico As Object, i As Long
    
    Set Dico = CreateObject("Scripting.Dictionary")
    If FeuilleExiste(ThisWorkbook, "Liste des contacts") Then Worksheets("Liste des contacts").Delete
    For Each Feuille In ThisWorkbook.Worksheets
        With Feuille
            TablContacts = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
            For i = LBound(TablContacts, 1) To UBound(TablContacts, 1)
                If Not Dico.exists(TablContacts(i, 1)) Then Dico.Add TablContacts(i, 1), TablContacts(i, 1)
            Next i
        End With
    Next Feuille
    ThisWorkbook.Worksheets.Add after:=Sheets(ThisWorkbook.Worksheets.Count)
    With ActiveSheet
        .Name = "Liste des contacts"
        .Range("A2").Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
    End With
    End Sub
    
    Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
     On Error Resume Next
     FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
    End Function
    0
    1. Yeeeah!! Ca marche!! Merci !!!

      Seul hic ce sont certains doublons.

      Le problème c'est que pour chaque feuille, dans ma col A j'ai les clients et en col B le type de palette envoyée. Ce qui donne:
      Col A Col B
      a F
      a C
      a C
      a E
      a C
      b C
      b etc
      b
      b
      c
      d
      d
      d
      e
      e

      Ce qui fait plus de 300 lignes pour chaque feuille. D'où le désire d'avoir sur une autre feuille tous les clients pour pouvoir faire une fonction countproduct pour compter combier de palettes bidule et combien de palettes machin ont été envoyé...

      Bref, j'ai du mal à comprendre votre macro (n'en ayant cotoyé que des simples) donc je croise les doigts pour qu'aucune info ne soit passé à l'oubliette.
      Mais je vous fait confiance !!

      Merci beaucoup !!
      0
    2. Autant pour moi, les doublons sont dû à des orthographe différents (majuscules ou points trainant par ci, par là)
      0
  2. Modérateur
    Tout va bien alors?

    Si vous le souhaitez, la macro peux s'occuper des countproduct à votre place...
    Vous dites...
    0
    1. A priori tout va bien! Grâce à toi ;)

      Je ne sais plus lequel du vous ou du tu utiliser... bref...

      J'avoue que si la macro pouvait compter mes petites palettes sans que j'ai besoin de m'arracher les cheveux avec toutes ces feuilles ce serait le pied!
      0
  3. Modérateur
    Tu, je ne sais jamais non plus... Mais tu c'est bien!

    réponse... dès que prêt!
    0
    1. Modérateur
      Dans les colonnes B, tu as un nom de palettes. Ok!
      Mais tu dois bien avoir quelque part le nombre de palettes commandées par le contact?
      0
      1. J'ai fait une simulation sur le mois de février dans un nouveau doc.

        J'ai trier les contacts (à côté de mes col A et B, en col E) puis créé de nouvelles colonnes, une pour chaque type de palette.
        J'avais fait une fonction que j'ai ensuite copié.

        Ce qui me donne:

        =SUMPRODUCT(($B$2:$B$329=E$1)*($A$2:$A$329=$D2))

        Col B: type de palette par client (sachant que 1 ligne = 1palette et non 1ligne =1client)
        Cel E: palette "cible"

        Col A: client
        Cel D: client "cible"

        Cela marche à la perfection. Mais maintenant que j'ai étendu sur l'année, ou plutôt 11mois (avec 1 par feuille), ça se complique!
        0
        1. Pour répondre à ta question plus clairement. Non, je n'ai pas le nombre de palettes envoyées. C'est justement le but de l'opération, avoir par client combien de palettes "A" ou "B" ou"C"...etc... qu'on a envoyé...
          0
          1. Modérateur
            Alors, testes ceci (c'est pas garantie!...):
            Option Explicit
            
            Sub Audrey()
            Dim Feuille As Worksheet, i As Long
            Dim TablContacts(), DicoNoms As Object
            Dim TablPalettes(), DicoPalettes As Object
            Dim Sommes(), t
            
            t = Timer
            Set DicoNoms = CreateObject("Scripting.Dictionary")
            Set DicoPalettes = CreateObject("Scripting.Dictionary")
            
            If FeuilleExiste(ThisWorkbook, "Liste des contacts") Then Worksheets("Liste des contacts").Delete
            
            For Each Feuille In ThisWorkbook.Worksheets
                With Feuille
                    TablContacts = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
                    For i = LBound(TablContacts, 1) To UBound(TablContacts, 1)
                        If Not DicoNoms.exists(TablContacts(i, 1)) Then DicoNoms.Add TablContacts(i, 1), TablContacts(i, 1)
                    Next i
                    TablPalettes = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
                    For i = LBound(TablPalettes, 1) To UBound(TablPalettes, 1)
                        DicoPalettes(TablPalettes(i, 1)) = DicoPalettes(TablPalettes(i, 1)) + 1
                    Next i
                End With
            Next Feuille
            
            ReDim Sommes(1 To DicoNoms.Count, 1 To DicoPalettes.Count)
            For Each Feuille In ThisWorkbook.Worksheets
                With Feuille
                    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
                        Sommes(Application.Match(.Cells(i, 1), DicoNoms.keys, 0), Application.Match(.Cells(i, 2), DicoPalettes.keys, 0)) = Sommes(Application.Match(.Cells(i, 1), DicoNoms.keys, 0), Application.Match(.Cells(i, 2), DicoPalettes.keys, 0)) + 1 '.Cells(i, 3).Value
                    Next i
                End With
            Next Feuille
            ThisWorkbook.Worksheets.Add after:=Sheets(ThisWorkbook.Worksheets.Count)
            With ActiveSheet
                .Name = "Liste des contacts"
                .Range("A2").Resize(DicoNoms.Count, 1) = Application.Transpose(DicoNoms.keys)
                .Range("B1").Resize(1, DicoPalettes.Count) = DicoPalettes.keys
                .Range("B2").Resize(UBound(Sommes, 1), UBound(Sommes, 2)) = Sommes()
            End With
            MsgBox "Procédure terminée en : " & Timer - t & " secondes. Tu peux reprendre un café..."
            End Sub
            
            Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
             On Error Resume Next
             FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
            End Function
            0
            1. Tu es un grand malade!!! J'adore!

              Ca marche du tonerre...!!

              Il faut juste que je reprenne l'orthographe des clients car certains reviennent plusieurs fois car écris differemment!

              Bref!!

              Merciiiiiiiiiiiiiiiii
              0
          2. Modérateur
            De rien.
            Au cas ou, tu sais ou demander?
            A+
            0
            1. Où?
              0
            2. Modérateur
              ha ha ha......

              ..... ben ici!
              0
            3. Ah bah oui!

              Merci encore Franck!!
              0
            4. Franck, R U there?
              0
            5. Modérateur
              audrey_ Allways!
              0
          3. J'ai besoin de tes talents pour plusieurs raisons.
            La première est que je n'arrive pas à renommer dans la macro la feuille créé par la macro.

            La deuxième est que je souhaiterai aller plus loin dans l'exploitation des infos générées par la macro: nouvelle feuille avec le top 10 et top5.

            Et je me demandais s'il est possible qu'excel repère repère les doublons causés par des différences d'écritures (ex: client a/client A/client.a)

            Donc, tu imagines bien que j'ai besoin de toi...
            0
            1. Modérateur
              Pour renommer la feuille, deux choses sont à changer dans le code :
              en début de code :
              If FeuilleExiste(ThisWorkbook, "Liste des contacts") Then Worksheets("Liste des contacts").Delete

              Changer "Liste des contacts" par ce que tu veux. Les 2 fois...

              Et, dans ces lignes :
              ThisWorkbook.Worksheets.Add after:=Sheets(ThisWorkbook.Worksheets.Count)
              With ActiveSheet
                  .Name = "Liste des contacts"

              Même chose, changer "Liste des contacts" par ce que tu veux...

              Qu'appelles tu Top10 et Top5?
              Tu veux dans une feuille, nommée Top10, tes 10 meilleurs vendeurs, et dans une autre, nommée Top5 tes 5 meilleurs, ou dans une seule feuille le top10? Ben oui le top5 c'est les 5 meilleurs du top10 non???

              Pour le repérage des doublons, c'est toujours délicat... Le risque le plus important est de supprimer des clients... Par conséquent, il te faut les traiter une fois pour toutes manuellement.
              Méthode :
              tu lances la macro. Donc tu va récupérer dans ta feuille de résultats, une liste de tes contacts allégées. Tu cherches, dans cette liste les noms qui seraient des doublons mais écris différemment, et, par macro* ou avec CTRL+H tu les remplaces dans chaque feuille... Je sais c'est long... Mais c'est la seule solution réellement correcte.
              *si tu veux je te fais un code...

              Ensuite, pour l'avenir, je te recommande de passer par un Userform de saisie.

              Je te bricole un truc dans le genre...
              0
              1. En fait, je voudrais, dans une nouvelle feuille, le top 5 pour 3types de palettes seulement, mais certains clients ne sont pas concernés donc il faudrait un top 7-8 (car au moins 2clients seront dans le top5 sans être concernés dc ils "pollueraient le top 5).

                Les infos sont des extractions de nos systèmes donc il faut surtout que je demande à chacun une rigueur dans les écritures pour éviter ces pb de doublons.
                0
            2. Modérateur
              Et zut, je suis allé trop vite en besogne...
              J'aurais du attendre ta réponse.
              C'est rien, je mets quand même un classeur exemple.
              https://www.cjoint.com/?BCin4dCNIkS

              La sub "audrey" en tiens pas compte des colonnes C (quantité)
              la sub "RécapAvecSommeDesColonnesC" fait le total par vendeur et par type de palette (ici ce sont de drôles de palettes;-)).
              la sub top10 fait le top 10 toutes palettes confondues.
              Idem pour top5

              Le formulaire de saisie est inutile...

              Ok. Je r'commence.
              Mais d'abord, comment choisis tu le critère de sélection "palette" du top10 et du top5???? Hein? Bonne question non?
              0
              1. Dans mon doc, j'ai juste col A = nom client et colB=palettes.
                Je n'ai pas une 3ème col ac la quantité totale par palettes.

                Col A Col B
                a F
                a C
                a C
                a E
                a C
                b C
                b etc

                Une ligne = 1palette et pas une quantité
                0
              2. Suis pas sûre d'être clair...
                0
              3. Modérateur
                si si, pas de souci.

                Je recommence avec un new file...
                0
            3. Lol... Oups... Désolée!!

              C'est possible une macro où on dit top 7-8 des palettes "a", "ba" et "c"??
              Ce serait mon critère.

              Tu le sais, il y a différents types de palettes, certaines ne sont pas récupérables chez le client. Seuls 3types le sont. Le but du top7-8 est de savoir qui sont les plus gros consommateurs de ces 3palettes récupérables
              0
              1. Modérateur
                Question :
                C'est possible une macro où on dit top 7-8 des palettes "a", "ba" et "c"??

                Tu veux :
                - le top10 de : palettes "a"
                - le top10 de palettes "ba"
                - le top10 de palettes "c"

                ou bien
                - le top10 de palettes "a" + "ba" + "c"

                ?????
                0
                1. J'aimerai le top 10 des clients qui consomment le plus de palettes a,b, et c.

                  Oui, je comprends ce que ta question. Alors on a qu'à faire un top 10 par type de palettes (pour ces 3), sur la mm feuille.
                  C'est possible ça?
                  0
                  1. Ateeeeeends

                    Il faut une étape intermédiaire pour que ça fasse ce que je veux

                    Donc il faut d'abord faire le total par clients pours ces 3palettes (client a : 300 (ce qui sera le total des 3palettes))
                    et ensuite faire le top10
                    0
                    1. Je n'en pense que du bien.

                      L'ai copié dans mon doc. mais ça ne marche plus...
                      0
                      1. Modérateur
                        mais ça ne marche plus... Ca c'est précis......
                        0
                      2. Oui, c'est pcq je cherche en mm temps

                        J'ai copié la macro et les userform

                        et ca me met "type mismatch"
                        0
                      3. Modérateur
                        et si, au lieu de copier la macro et les userform, tu collais tes données dans mon classeur... Puisqu'il fonctionne.
                        0
                      4. Alors en fait la macro "audrey" fait comme avant.

                        Les userform n'apparaisse nul part (faut que je les refasse??? ) dc pas de top 10
                        0
                      5. Vais essayer... J'avais pas vu ta rp
                        0
                    2. Modérateur
                      Bernard tu peux le virer sans souci.

                      Par contre tu touches pas à Whyskie... Nanmého!

                      Content pour toi.

                      A+ peut être...
                      0
                      1. Lool!!

                        Merci pour tout !!!!

                        A bientot puisque je sais où te trouver!!
                        Bisous
                        0
                      2. Franck???

                        Oui, c'est encore moi... 2mois après ... TADAM...!!
                        0
                    3. Modérateur
                      Salut Audrey-
                      Oui???

                      Quelqu'un m'appelle?

                      Tadam boum j'arrive.

                      KessKissPass?
                      0
                      1. Roooo super...!! Tu es là...!!

                        Comment tu vas?

                        Je t'ai appelé parce que (toujours pour ce même doc), j'ai un nouveau besoin.
                        Après le top 10, j'ai besoin d'un "worth 10" (tout pareil que le top 10 avec bouton et tout le tralala mais avec les 10pires. Dans le même onglet que le top 10.
                        Tu crois que c'est possible?
                        0
                    4. Modérateur
                      ça va bien. Merci! Et toi?

                      Peux tu me transférer ton fichier, je ne l'ai pas conservé... S'il contient des infos confidentielles, tu peux me l'envoyer par MP : ICI
                      ou par mail à l'adresse que tu trouveras dans mon profil (clic sur mon pseudo)
                      0
                      1. Impeccable, merci!

                        je t'ai envoyé un mail...!!
                        0