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 :

Répartition entre agents


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Financial analyst
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Financial analyst
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Par défaut Répartition entre agents
    Bonsoir à tous,

    Je viens vers vous puisque mes compétences en Excel/VBA ont été dépassées.

    Dans l'absolue, j'aimerais répartir les nonbres de la colonne B entre les 9 différents agents de façon équilibré. la somme de la colonne B étant 3 074 532,47 chaque agents devraient avoir une somme proche de 341 614,7. bien entendu chaque nombre ne peuevnt être utilisé qu'une seule fois.

    j'espère que mon explication est assez claire

    merci pour votre aide et pour votre temps
    Fichiers attachés Fichiers attachés

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Le pb m'a intéressé. Je te propose une procédure.
    Pour la faire fonctionner,
    • il faut nommer la liste des valeurs à répartir, j'ai nommé cette plage "nmVal", dans ton exemple B5:B3222
    • il faut nommer le tableau des agents sans la ligne de titre et avec une ligne supplémentaire pour afficher les totaux, j'ai nommé cette plage "nmAgents", dans ton exemple E5:M3223


    Le code
    • trie d'abord les valeurs à répartir
    • puis fait une première répartition en zigzag.
    • puis tant qu'on trouve une valeur pour réduire l'écart entre total min et total max, on enlève cette valeur à l'agent du max pour la mettre à l'agent du min.


    Un coefficient est à optimiser, voir dans le code : entre 0,5 <= Coef < 1.
    A 0,5 le code est rapide. Dans ton exemple, l'écart max final est 0,48. Près de 1, le code est beaucoup plus lent. Avec 0,99 on a un écart final de 0,04.
    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
    Sub subRepart()
     
    Dim oRng As Excel.Range
    Dim vVal As Variant, lVal As Long
    Dim vAgents As Variant, lAg As Long, jAg As Integer, jMin As Integer, jMax As Integer
    Dim lNbVal As Long, iNbAgents As Integer
    Dim jInit As Integer
    Dim dblDelta As Double
     
    Set oRng = ThisWorkbook.Names("nmVal").RefersToRange
    oRng.Sort oRng(1, 1), xlDescending
    vVal = oRng.Value
     
    Set oRng = ThisWorkbook.Names("nmAgents").RefersToRange
    vAgents = oRng.Value
     
    lNbVal = UBound(vVal, 1)
    iNbAgents = UBound(vAgents, 2)
    If lNbVal <> UBound(vAgents, 1) - 1 Then GoTo etqErr1
     
    'mettre tab agents à zéro
    For lAg = 1 To UBound(vAgents, 1)
        For jAg = 1 To iNbAgents
            vAgents(lAg, jAg) = 0
        Next jAg
    Next lAg
     
    'répartition initiale et calcul des sommes
    jInit = 0
    For lVal = 1 To UBound(vVal, 1)
        jInit = IIf(jInit = 2 * iNbAgents, 1, jInit + 1)
        jAg = IIf(jInit <= iNbAgents, jInit, 2 * iNbAgents - jInit + 1)
        vAgents(lVal, jAg) = vVal(lVal, 1)
        vAgents(lNbVal + 1, jAg) = vAgents(lNbVal + 1, jAg) + vVal(lVal, 1)
    Next lVal
     
    Do
        'rechercher les totaux Min et Max, et calculer la différence
        jMin = 1
        jMax = 1
     
        For jAg = 2 To UBound(vAgents, 2)
            If vAgents(lNbVal + 1, jAg) < vAgents(lNbVal + 1, jMin) Then jMin = jAg
            If vAgents(lNbVal + 1, jAg) > vAgents(lNbVal + 1, jMax) Then jMax = jAg
        Next jAg
     
        dblDelta = vAgents(lNbVal + 1, jMax) - vAgents(lNbVal + 1, jMin)
     
        'rechercher le plus grand montant de Max à basculer vers min pour équilibrer le couple
        For lVal = 1 To lNbVal
            If (vAgents(lVal, jMax) > 0) And (vAgents(lVal, jMax) <= dblDelta * 0.5) Then Exit For 'ici le coefficient à régler = 0,5
        Next lVal
     
        'enlever la valeur à max pour la mettre à min
        If lVal <= lNbVal Then
            vAgents(lVal, jMin) = vAgents(lVal, jMax)
            vAgents(lVal, jMax) = 0
            vAgents(lNbVal + 1, jMin) = vAgents(lNbVal + 1, jMin) + vAgents(lVal, jMin)
            vAgents(lNbVal + 1, jMax) = vAgents(lNbVal + 1, jMax) - vAgents(lVal, jMin)
        Else
            'on n'a pas trouvé de valeur à basculer, on arrête
            Exit Do
        End If
     
    Loop
     
    oRng.Value = vAgents
     
    Set oRng = ThisWorkbook.Names("nmVal").RefersToRange
    oRng.Value = vVal
     
    Set oRng = Nothing: vAgents = Null: vVal = Null
     
    etqSortie:
        Exit Sub
     
    etqErr1:
        MsgBox "Les plages des noms définis ""nmVal"" et ""nmAgents"" ne sont pas correctes."
        GoTo etqSortie
     
    End Sub
    Cordialement,

    PGZ

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Financial analyst
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Financial analyst
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Par défaut
    Bonjour PGZ, bonjour le forum

    Désolé de cette réponse tardive.

    je pense que je dois faire une mauvaise manipe car le code ne fonctionne pas.

    Une erreur 400 apparait.

    Merci de ton aide

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Oui, tu dois faire une mauvaise manip, mais on ne peut pas voir sans autre indication.
    Comme cela je ne vois que 2 choses :
    • as-tu enlevé le code que tu avais déjà écrit ? Ce code provoque une erreur.
    • As-tu bien nommée les 2 plages indiquées ?


    Sinon, peux-tu joindre ton nouveau classeur après modif?

    Cordialement,

    PGZ

Discussions similaires

  1. Communication entre agents
    Par othmanebouzekri dans le forum Développement
    Réponses: 1
    Dernier message: 28/08/2013, 16h18
  2. probleme de communication entre agent jade
    Par sousou12 dans le forum Programmation par agent
    Réponses: 0
    Dernier message: 02/05/2013, 10h58
  3. [Jade] Problème de communication entre agents en Jade
    Par nanousa1985 dans le forum Programmation par agent
    Réponses: 1
    Dernier message: 19/05/2012, 11h53
  4. communication entre agents sous eclipse utilisant la plateforme JADE
    Par ASSOUMA2007 dans le forum Programmation par agent
    Réponses: 2
    Dernier message: 24/12/2008, 12h29
  5. communication entre agents sous eclipse utilisant la plateforme JADE
    Par ASSOUMA2007 dans le forum Général Java
    Réponses: 2
    Dernier message: 24/12/2008, 12h29

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