XL 2019 Consolidation des ventes par client

p4u02614

XLDnaute Nouveau
Bonjour ou bonsoir à tous.
Je cherche une solution pour créer un tableau de consolidation de mes ventes annuelles.
Je vous mets en pièce jointe un petit fichier ou j'ai créer des ventes pour trois mois ainsi que la feuille de consolidation dans laquelle je souhaiterais avoir la liste de mes clients sans doublon triée et dans la colonne suivante la somme des montants des ventes pour ce même clients.
Merci par avance à toutes les personnes qui pourront m'aider.
 

Pièces jointes

  • Recap. Ventes.xlsx
    18.8 KB · Affichages: 21

Softmama

XLDnaute Accro
Bonjour p4u02614,

En PJ, une solution par fonction personnalisée, qui répond à la demande (j'ai un écart par rapport à votre exemple, mais à priori, l'erreur provient de vous) :

VB:
Function magicSom(Nom As String)
Application.Volatile
Dim ws As Worksheet, Som As Double

For Each ws In ThisWorkbook.Worksheets

  If ws.Range("A1") = "Nom du client" And ws.Name <> "Consolidation" Then
    Som = Som + Application.WorksheetFunction.SumIf(ws.Range("A1:A1000"), Nom, ws.Range("B1:B1000"))
  End If
Next

magicSom = Som
End Function

cf. fichier joint
 

Pièces jointes

  • Recap. Ventes Soft.xlsm
    26.3 KB · Affichages: 9

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Voici une récap par power query (inclus dans votre version excel).
Par contre, nommez vos tableaux avec les noms de mois tels que excel les comprends : "Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre" avec accent ou modifiez l'étape 'Source' de la requête en conséquence.
= Table.FromList("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"},null,{"Tableaux"})

Quand vous ajouterez un nouveau tableau mensuel, il ne vous restera qu'à actualiser la requête (click-droit dans une cellule du tableau -> Actualiser)

Cordialement
 

Pièces jointes

  • Recap. Ventes.xlsx
    32.4 KB · Affichages: 17
Dernière édition:

p4u02614

XLDnaute Nouveau
Merci beaucoup Softmama, mais lorsque j'ajoute le mois d'avril (et il faudra aller jusqu'en décembre il n'en tient pas compte ! Pourtant du peu que je comprenne du VBA tu as bien mis la condition : "pour chaque feuille contenant dans la cellule A1 le texte "Nom du client, sauf pour la feuille "Consolidation" !

P.S. : C'est bien moi qui ai fais une faute de calcul dans mon modèle LOL

Bonjour,

Voici une récap par power query (inclus dans votre version excel).
Par contre, nommez vos tableaux avec les noms de mois tels que excel les comprends : "Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre" avec accent ou modifiez l'étape 'Source' de la requête en conséquence.


Quand vous ajouterez un nouveau tableau mensuel, il ne vous restera qu'à actualiser la requête (click-droit dans une cellule du tableau -> Actualiser)

Cordialement
Cela fonctionne et j'ai même compris ! Très bonne soirée et mille mercis pour votre aide.
 

Pièces jointes

  • Recap. Ventes Soft 2.xlsm
    27.4 KB · Affichages: 11

Softmama

XLDnaute Accro
Bonjour p4u02614, Roblochon

En effet, il y a un élément non pris en compte dans ma proposition.
En colonne A de la feuille consolidation, il faut que tous les vendeurs soient listés, il n'y a pas de mise à jour automatique. La fonction personnalisée donne le total des ventes pour un vendeur choisi. Si vous ne notez pas son nom, il n'y a pas de résultat. En notant Walter en colonne A de l'onglet Consolidation, son total s'affiche bien en colonne B.

Mais effectivement, ce n'est pas dans votre cas probablement le plus pertinent pour répondre à votre besoin.
J'ai donc modifié le fichier pour que l'ensemble des vendeurs soit toujours listé dans l'onglet consolidation.

Les calculs se mettent à jour à chaque activation de l'onglet Consolidation :

Dans le Module de feuille "Consolidation" :
VB:
Private Sub Worksheet_Activate()
Dim ws As Worksheet, Som As Double, Vendeurs(), SommeVentes(), c As Range, n As Integer, x As Integer, t As Integer, Trouvé As Boolean


n = 0
ReDim Vendeurs(1 To 1)
ReDim SommeVentes(1 To 1)


For Each ws In ThisWorkbook.Worksheets


  If ws.Range("A1") = "Nom du client" And ws.Name <> "Consolidation" Then
    Set c = ws.Range("A2")
    Do While c <> ""
     
      'Recherche si nouveau vendeur ?
      Trouvé = False
      For t = LBound(Vendeurs) To UBound(Vendeurs)
        If Vendeurs(t) = c Then Trouvé = True: Exit For
      Next
     
      If Not Trouvé Then
        'Nouveau vendeur, on l'ajoute au tableau
        n = n + 1
        ReDim Preserve Vendeurs(1 To n)
        ReDim Preserve SommeVentes(1 To n)
        Vendeurs(n) = c
        SommeVentes(n) = 0
        x = n
      End If
     
      'mise à jour des ventes faites pour ce vendeur
      SommeVentes(x) = SommeVentes(x) + c.Offset(, 1)
     
      'on passe à la vente suivante
      Set c = c.Offset(1)
     
    Loop
  End If
'on passe au mois suivant
Next


'affichage des résultats
Feuil4.Range("A2:B100000").ClearContents
Feuil4.Range("A2").Resize(UBound(Vendeurs), 1) = Application.Transpose(Vendeurs())
Feuil4.Range("B2").Resize(UBound(Vendeurs), 1) = Application.Transpose(SommeVentes())


End Sub

Votre fichier en PJ
 

Pièces jointes

  • Recap. Ventes Soft 2.xlsm
    29.4 KB · Affichages: 9

p4u02614

XLDnaute Nouveau
Bonjour p4u02614, Roblochon

En effet, il y a un élément non pris en compte dans ma proposition.
En colonne A de la feuille consolidation, il faut que tous les vendeurs soient listés, il n'y a pas de mise à jour automatique. La fonction personnalisée donne le total des ventes pour un vendeur choisi. Si vous ne notez pas son nom, il n'y a pas de résultat. En notant Walter en colonne A de l'onglet Consolidation, son total s'affiche bien en colonne B.

Mais effectivement, ce n'est pas dans votre cas probablement le plus pertinent pour répondre à votre besoin.
J'ai donc modifié le fichier pour que l'ensemble des vendeurs soit toujours listé dans l'onglet consolidation.

Les calculs se mettent à jour à chaque activation de l'onglet Consolidation :

Dans le Module de feuille "Consolidation" :
VB:
Private Sub Worksheet_Activate()
Dim ws As Worksheet, Som As Double, Vendeurs(), SommeVentes(), c As Range, n As Integer, x As Integer, t As Integer, Trouvé As Boolean


n = 0
ReDim Vendeurs(1 To 1)
ReDim SommeVentes(1 To 1)


For Each ws In ThisWorkbook.Worksheets


  If ws.Range("A1") = "Nom du client" And ws.Name <> "Consolidation" Then
    Set c = ws.Range("A2")
    Do While c <> ""
   
      'Recherche si nouveau vendeur ?
      Trouvé = False
      For t = LBound(Vendeurs) To UBound(Vendeurs)
        If Vendeurs(t) = c Then Trouvé = True: Exit For
      Next
   
      If Not Trouvé Then
        'Nouveau vendeur, on l'ajoute au tableau
        n = n + 1
        ReDim Preserve Vendeurs(1 To n)
        ReDim Preserve SommeVentes(1 To n)
        Vendeurs(n) = c
        SommeVentes(n) = 0
        x = n
      End If
   
      'mise à jour des ventes faites pour ce vendeur
      SommeVentes(x) = SommeVentes(x) + c.Offset(, 1)
   
      'on passe à la vente suivante
      Set c = c.Offset(1)
   
    Loop
  End If
'on passe au mois suivant
Next


'affichage des résultats
Feuil4.Range("A2:B100000").ClearContents
Feuil4.Range("A2").Resize(UBound(Vendeurs), 1) = Application.Transpose(Vendeurs())
Feuil4.Range("B2").Resize(UBound(Vendeurs), 1) = Application.Transpose(SommeVentes())


End Sub

Votre fichier en PJ
C'est gentil. Mais malheureusement aucune somme n'est juste !
 

Pièces jointes

  • Recap. Ventes Soft 2.xlsm
    30.5 KB · Affichages: 7

Softmama

XLDnaute Accro
Bonjour p4u02614,

C'est du plus gênant effet...
Une petite erreur de variable : je l'appelle t en début de macro, puis elle se nomme x ensuite... donc effectivement les sommes sont erronées...
Désolé pour ce manque d'attention
Correctif ci dessous...
 

Pièces jointes

  • Recap. Ventes Soft 2.xlsm
    29.5 KB · Affichages: 11

bcharef

XLDnaute Accro
Bonjour à toutes et à tous.

Voici un autre essai avec un TCD regroupant les douze mois, avec une macro permettant uniquement d'actualiser le TCD ainsi qu'un segment permettant le choix du mois à afficher les résultats..

Bonne lecture.

Amicalement.

Bcharef
 

Pièces jointes

  • Recap. VentesTcdV01.xlsm
    47.2 KB · Affichages: 7

p4u02614

XLDnaute Nouveau
Bonjour p4u02614,

C'est du plus gênant effet...
Une petite erreur de variable : je l'appelle t en début de macro, puis elle se nomme x ensuite... donc effectivement les sommes sont erronées...
Désolé pour ce manque d'attention
Correctif ci dessous...
Bonjour Softmana,
Effectivement, les additions fonctionnent parfaitement.
Mais serait-il possible (sans trop te déranger) de faire un tri par ordre alphabétique sur 'le nom des clients' juste après l'affichage ?
Avec cette petite correction, je pourrais corriger (et simplifier quelques un de mes fichiers Excel !
D'avance un tout grands merci à toi et à la collectivité qui passez du temps à aider les autres.
 

Softmama

XLDnaute Accro
Bonjour,

Une approche rapide qui devrait répondre au besoin, avec un ajout de tri en fin de procédure :
VB:
Private Sub Worksheet_Activate()
Dim ws As Worksheet, Som As Double, Vendeurs(), SommeVentes(), c As Range, n As Integer, x As Integer, t As Integer, Trouvé As Boolean, Flag as Boolean

n = 0
ReDim Vendeurs(1 To 1)
ReDim SommeVentes(1 To 1)

For Each ws In ThisWorkbook.Worksheets

  If ws.Range("A1") = "Nom du client" And ws.Name <> "Consolidation" Then
    Set c = ws.Range("A2")
    Do While c <> ""
      
      'Recherche si nouveau vendeur ?
      Trouvé = False
      For x = LBound(Vendeurs) To UBound(Vendeurs)
        If Vendeurs(x) = c Then Trouvé = True: Exit For
      Next
      
      If Not Trouvé Then
        'Nouveau vendeur, on l'ajoute au tableau
        n = n + 1
        ReDim Preserve Vendeurs(1 To n)
        ReDim Preserve SommeVentes(1 To n)
        Vendeurs(n) = c
        SommeVentes(n) = 0
        x = n
      End If
      
      'mise à jour des ventes faites pour ce vendeur
      SommeVentes(x) = SommeVentes(x) + c.Offset(, 1)
      
      'on passe à la vente suivante
      Set c = c.Offset(1)
      
    'on passe au mois suivant
    Loop
  End If
Next

'Tri par ordre alpha des résultats
1 Flag = False
For t = 1 To UBound(Vendeurs) - 1
  If Vendeurs(t) > Vendeurs(t + 1) Then
    temp = Vendeurs(t + 1): Vendeurs(t + 1) = Vendeurs(t): Vendeurs(t) = temp: temp = SommeVentes(t + 1): SommeVentes(t + 1) = SommeVentes(t): SommeVentes(t) = temp: flag = True
  End If
Next
If flag Then GoTo 1 'Besoin de retrier ?

'affichage des résultats
Feuil4.Range("A2:B100000").ClearContents
Feuil4.Range("A2").Resize(UBound(Vendeurs), 1) = Application.Transpose(Vendeurs())
Feuil4.Range("B2").Resize(UBound(Vendeurs), 1) = Application.Transpose(SommeVentes())

End Sub

A tester, fichier en PJ.
 

Pièces jointes

  • Copie de Recap. Ventes Soft 2.xlsm
    27.2 KB · Affichages: 17

p4u02614

XLDnaute Nouveau
Bonjour Softmama,
Mille merci. Avec cette correction c'est parfaitement parfait !!! LOL
Je me m'est tout de suite à l'ouvrage pour la consolidation de certains de mes fichiers.
Merci aussi à ce site et ses participants qui nous permets de mieux comprendre Microsoft Excel !

P. S. : Ne faudrait il pas ajouter "Résolu' sur le titre et si 'OUI' comment le faire ?
 

Discussions similaires

Statistiques des forums

Discussions
314 708
Messages
2 112 099
Membres
111 416
dernier inscrit
philipperoy83