Scénario vente si je réaffecte un % de qté à un autre client

Bonjour,

Désolé de ce long titre. Pas évident de trouver un texte explicite !

Dans le fichier ci-joint, j'ai 5 catégories de client avec des remises différentes (attention, parfois pour une même catégorie, le % de remise est différent)

Sont indiquées les qtés facturées, ainsi que les reliquats.

Je voudrais créer un scénario de vente, sous entendu :

Pour chaque ligne, si je réaffecte X % de la qté facturée (on peut arrondir la qté à l'entier supérieur), vers un client de la catégorie inférieure et dans la limite de son reliquat, quel montant cela donne ?

Je souhaiterais avoir le choix du pourcentage à réaffecter.

Je ne sais pas si je suis très clair...mais merci à ceux qui prendront le temps de se pencher sur ma demande

17scenario-vente.xlsx (15.00 Ko)

Bonjour,

Je ne sais pas si je suis très clair...

Pour moi, absolument pas !

Comment veux réaffecter une quantité que tu as facturé ? Si je comprend bien, tu veux donner à un autre client les fournitures payées par le premier ! Je pense que un peu plus d'explications s'impose.

Pas de souci.

Il faut prendre ça comme une simulation.

Fichier de départ = ce que j ai réellement facturé.

Fichier d arrivée = si j avais fait autrement avec telles qté reaffectées, alors ma facturation aurait été de tel montant.

L idée est de comparer ce qui est réellement facturé à ce qui aurait pu l être dans d autres conditions.

Rajout d'info, peut-être que ça parlera à qq'un.

Reliquat= qté max commandée par le client et pas encore livrée.

En résumé :

- Client 1 a remise de 50%. Il commande 100pcs. Je livre 80.

- Client 2 a remise de 30%. Il commande 70pcs. Je livre 20.

Cela me donne un certain montant total facturé.

Quel serait ce montant si j'avais décidé d'affecter 10% du client 1 au client 2 (donc 8pcs en moins pour client 1 et 8 en plus pour client 2), sans dépasser son reliquat

Je voudrais avoir le choix du pourcentage. Je suppose que ça passe par du VBA...je ne sais pas faire.

Bon ben je suis quelque part content d'avoir posé une colle

Merci tout de même à ceux qui auront jeter un coup d'œil et lâchement abandonné

Vais essayer de tourner le problème autrement. Quand ça ne passe pas dans un sens, faut tenter dans l'autre

Bonjour,

Merci tout de même à ceux qui auront jeter un coup d'œil et lâchement abandonné

Avec les explications données tu ne peux pas prétendre à plus (après plus de 70 vues, je suis le seul à avoir essayé de comprendre ta demande !)

Tu souhaites réaffecter des quantités d'un client à un autre mais tu ne dis pas comment s'effectue le choix du second client, est-il le seul, faut-il prendre tous ceux qui pourraient correspondre ?

Expliques avec précisions comment tu veux que ton scénario se déroule. Tu veux des formules Excel, une procédure VBA ?

Et je te remercie d'avoir pris du temps pour ma demande.

Traduire une pensée "quand on a le nez dedans" en logique Excel, pas simple.

Ci-joint une version remaniée du fichier (y avait un oubli de calcul) et surtout le déroulé de ma pensée. Si ça peut aider.

Le fichier s'ouvre sur la feuille explicative.

A mon avis, c'est du VBA au niveau complexité. Mon "seul" besoin est de pouvoir choisir le taux de % que je réaffecte.

Je suis sur mon iPhone mais je regarde demain si je peux t’aider et ce sera avec plaisir !

Bonjour,

Je suis parti du principe de ne récupérer que les reliquats les plus importants de chaque catégorie pour le produit choisi. Par exemple, si je prend le produit "BONBON", c'est le client "Client 1" qui a le reliquat le plus élevé (1273) et pour les clients de catégorie inférieure, il y a les clients "Client 66", "Client 91" et "Client 129" avec comme reliquat respectif 51, 13 et 1.

Pour ce premier jet, j'ai pris la valeur totale du reliquat du client "inférieur" pour faire la simulation qui le concerne à savoir par exemple que si on redistribue 51 produits du client "Client 1" au client "Client 66" (il a 51 produits en reliquats) la simulation donne 715,24 HT Net contre 522,82 HT Net dans l'état réel soit un Delta de 192,42. Ceci se fait pour chaque catégorie de client. Les résultats sont affichés dans la feuille "Résultat" (feuille que j'ai ajouté). Il faut renseigner la cellule B1 du produit recherché et cliquer sur le bouton :

Wouah, sacrée avancée ! Ah c'est beau de savoir faire

Merci pour les explications dans la macro, ça m'aide à suivre les étapes de calcul.

L'approche par le reliquat est intéressante, c'est vrai que je n'avais pas envisagé le problème par ce sens.

Mais je ne souhaite pas nécessairement livrer l'ensemble du reliquat, même lorsque c'est possible. C'est bien tout mon problème.

C'est pour cette raison que j'avais opté pour un % de qté qui me semble être le meilleur compromis.

(en gros, c'est un peu fromage OU dessert...je ne peux pas livrer tout le monde, je cherche donc à trouver le meilleur équilibre possible pour ménager la chèvre et le choux)

Autre point, est-il possible de déclencher la simulation pour l'ensemble des produits, sans avoir à choisir "BONBON" ou "LEGUMES" ?

En tous cas, grand merci, cela me permet déjà de me faire une idée (bon faut que transcrive ça sur mon fichier réel, plus complexe, mais avec tes explications de la macro je devrais y arriver )

Et question subsidiaire, est-il possible de faire apparaître une colonne spécifiant le nombre de produit réaffecté ? (pour chaque ligne, pas un total général).

Bonjour,

A tester en entrant le pourcentage de réaffectation en B1 de la feuille "Résultat" :

Je vais prendre le temps d'étudier tout ça demain en détail mais à première vue ça m'a l'air royal.

D'ors et déjà, un très très grand merci pour ton aide, ton temps et ta patience

Bonjour,

J'ai modifié le code pour prendre en compte la quantité disponible afin que la quantité réaffectée ne dépasse pas cette dernière. Si tu ne veux pas en tenir compte, j'ai indiqué les endroits où supprimer les lignes de code. J'ai aussi fais en sorte de ne pas afficher les valeurs = à 0. Je ne re poste pas le classeur mais juste le code :

Sub Simulation()

    Dim Tbl()
    Dim TblCritere() As String
    Dim Dico As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
    Dim Plage As Range
    Dim PlageResult As Range
    Dim Cel As Range
    Dim Pourcent As Single
    Dim I As Integer
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer
    Dim Total As Long '<---- à supprimer si on ne veut pas tenir compte du total !

    'pourcentage de produits réaffecté (entrer sous cette forme : 50 pour 50 pourcent)
    Pourcent = Worksheets("Résultat").Range("B1").Value / 100

    Set Dico = CreateObject("Scripting.Dictionary")

    'défini la plage sur toute la feuille
    Set Plage = DefPlage(Worksheets("Page 1"))

    'plage pour les résultats (la vide si présence de valeurs)
    Set PlageResult = DefPlage(Worksheets("Résultat"), 4, 1)
    If PlageResult(1, 1).Row > 3 Then PlageResult.Clear

    'tri sur "catégorie client" de la plus grande à la plus petite
    Plage.Sort Plage(1, 3), xlDescending, , , , , , xlYes

    'récupère les produits en dédoublonnant
    For Each Cel In Plage.Columns(2).Cells

        If Cel.Row > 1 Then Dico(Cel.Value) = Cel.Value

    Next Cel

    'transfère dans un tableau afin de réutiliser le dictionnaire...
    ReDim TblCritere(1 To Dico.Count)
    ListeCle = Dico.Keys
    For I = 1 To UBound(TblCritere): TblCritere(I) = ListeCle(I - 1): Next I

    'commence les résultats après la ligne 3 (entêtes)
    K = 3

    'boucle sur les produits
    For I = 1 To UBound(TblCritere)

        'vide le dictionnaire et le tableau pour chaque produit et remise à 0 de J
        Dico.RemoveAll
        Erase Tbl()
        J = 0

        'filtre sur la colonne des produits ("Famille UH")
        Plage.AutoFilter 2, "=" & TblCritere(I)

        For Each Cel In Plage.Columns(3).Cells.SpecialCells(xlCellTypeVisible)

            'évite de prendre en compte la ligne d'entêtes
            If Cel.Row > 1 Then

                'récupère les clients ayant le reliquat le plus important de chaque catégorie pour le produit en cours
                If Cel.Offset(, 6).Value > Dico(Cel.Value) Then

                    'ne redimensionne que si c'est une nouvelle catégorie
                    If IsEmpty(Dico(Cel.Value)) Then J = J + 1: ReDim Preserve Tbl(1 To 6, 1 To J)

                    'stocke le reliquat dans le dictionnaire (valeur de la clé), (la clé étant la catégorie client)
                    Dico(Cel.Value) = Cel.Offset(, 6).Value

                    Tbl(1, J) = Cel.Offset(, -2).Value 'nom du client
                    Tbl(2, J) = Cel.Offset(, 2).Value 'prix du produit
                    Tbl(3, J) = Cel.Offset(, 4).Value 'remise
                    Tbl(4, J) = Cel.Offset(, 5).Value 'HT net
                    Tbl(5, J) = Cel.Offset(, 6).Value 'reliquat
                    Tbl(6, J) = Cel.Value 'catégorie client

                End If

            End If

        Next Cel

        'si le tableau a été initialisé (produit trouvé)
        If Not Not Tbl Then

            With Worksheets("Résultat")

                K = K + 1

                'nom du produit en cours
                .Cells(K, 1).Value = TblCritere(I)

                'catégorie supérieure...
                For L = 1 To UBound(Tbl, 2) - 1

                    K = K + 1
                    .Cells(K, 1).Value = Tbl(6, L) 'catégorie
                    .Cells(K, 2).Value = Tbl(1, L) 'nom client
                    .Cells(K, 4).Value = Tbl(2, L) 'prix de l'article
                    .Cells(K, 5).Value = Tbl(3, L) 'montant de la remise
                    .Cells(K, 6).Value = Round(Tbl(4, L), 2) 'montant HT Net
                    .Cells(K, 7).Value = Tbl(5, L) 'reliquat

                    '...catégorie inférieure
                    For J = L + 1 To UBound(Tbl, 2)

                        'ne prend pas en compte ceux dont la valeur est égale à 0
                        '(Int() supprime la partie décimale donc si reliquat = 1 avec 50 % de réaffectation celà donne 0,5 donc 0 !)
                        If Int(Tbl(5, J) * Pourcent) > 0 Then

                            'totalise le nombre de produits réaffectés...
                            Total = Total + Int(Tbl(5, J) * Pourcent) '<---- à supprimer si on ne veut pas tenir compte du total !

                            '...de façon à ce que ce nombre ne puisse dépasser la quantité disponible
                            If Total <= Tbl(5, L) Then '<---- à supprimer si on ne veut pas tenir compte du total !

                                K = K + 1
                                .Cells(K, 1).Value = Tbl(6, J) 'catégorie
                                .Cells(K, 3).Value = Tbl(1, J) 'nom client
                                .Cells(K, 5).Value = Tbl(3, J) 'montant de la remise
                                .Cells(K, 6).Value = Round(Tbl(4, J), 2) 'montant HT Net
                                .Cells(K, 7).Value = Tbl(5, J) 'reliquat
                                .Cells(K, 8).Value = Round(Tbl(4, L) + Tbl(4, J), 2) 'total des HT Nets
                                .Cells(K, 9).Value = Round(Tbl(4, L) + Tbl(4, J) + Tbl(2, J) * (1 - Tbl(3, L) / 100) * Int(Tbl(5, J) * Pourcent), 2) 'total des HT Nets en simulation
                                .Cells(K, 10).Value = .Cells(K, 9).Value - .Cells(K, 8).Value 'Delta
                                .Cells(K, 11).Value = Int(Tbl(5, J) * Pourcent) 'quantité réaffectée

                            End If '<---- à supprimer si on ne veut pas tenir compte du total !

                        End If

                    Next J

                    K = K + 1 'ligne vide entre les comparaisons

                    Total = 0 'pour la catégorie suivante <---- à supprimer si on ne veut pas tenir compte du total !

                Next L

            End With

        End If

        'supression du filtrage
        Plage.AutoFilter

    Next I

End Sub

Bonjour Theze,

Désolé pour ma réponse tardive mais je me suis un peu embêté pour retranscrire tout ça dans mon fichier réel.

J'ai fini par y arriver heuresuemetn et cela répond totalement à mon besoin.

Donc un très grand merci pour ton aide et le temps que tu m'as consacré.

Demande résolue !

Ah si, une petite chose.

J'ai rajouté quelques mises en forme ici et là (des sommes, des données en gras, des décimales,...) mais elle sont perdues à chaque fois que je lance la macro.

Je n'ai pas trouvé dans le code l'élément à modifier.

Bonjour,

C’est «PlageResult.Clear» qui supprime tout se qui se trouve sous la ligne d’entêtes !

Je vois bien la ligne, j'ai fouiné partout dans le code, tenté des supprimer ce qui me semblait le plus cohérent, et bon...échec cuisant

Tout se décale, et ça met le bazar sans que je ne "comprenne" la corrélation.

Merci tout de même, ça m'encourage à m'acheter un bouquin pour y voir plus clair.

Vachement puissant quand même le vba, quand on sait l'utiliser....Et qu'on arrive à définir son besoin dès le début !

Bonjour,

Postes un classeur avec tes formules que je puisse éventuellement adapter !

Rechercher des sujets similaires à "scenario vente reaffecte qte client"