Assigner des dossiers à des représentants

  • Initiateur de la discussion Initiateur de la discussion pacoako
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pacoako

XLDnaute Occasionnel
Bonjour tout le monde!

J'ai un petit problème pour vous 😉

J'essaie d'assigner des dossiers à des représentants dépendement du nombre de dossier qu'ils ont en main présentement. La règle est assez simple. Le représentant qui à le moins de dossier se voit attribuer le nouveau dossier entrant. Je bloque cependant à un endroit dans mon code...

Je réussi à trouver le nom et le nombre de dossier qu'un représentant a en main et stocker l'information dans une variable de type variant.

Donc mon information peut être représenté comme ceci :

Dim AgentNameNumber As Variant
...
AgentNameNumber(0,0) = Représentant # 1
AgentNameNumber(0,1) = 1 'Qui est le nombre de dossier(s)

AgentNameNumber(1,0) = Représentant # 2
AgentNameNumber(1,1) = 0

AgentNameNumber(2,0) = Représentant # 3
AgentNameNumber(2,1) = 2

etc...

Je me demande simplement comment puis-je stocker dans un string le nom du représentant qui à le moins de dossier afin que je puisse l'utiliser ailleurs dans mon code.

Merci infiniment d'avance pour votre précieux temps =)

Bonne journée à tous!

=====

J'ai peut-être trouvé une piste? Application.min(AgentNameNumber) me donne la plus petite valeur de celle-ci.. mais est-ce possible de savoir à quelle représentant cette valeur fait référence?
 
Dernière édition:
Re : Assigner des dossiers à des représentants

Bonjour,

Peut être une piste avec ces lignes de code à extrapoler

'*****************
Dim i&
Dim PlusPetit&
Dim Nom$

PlusPetit& = 999999 'un grand nombre fixé de manière arbitraire
For i& = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)
If AgentNameNumber(i&, 1) < PlusPetit& Then
PlusPetit& = AgentNameNumber(i&, 1)
Nom$ = AgentNameNumber(i&, 0)
Next i&
MsgBox Nom$ & " Nb dossier : " & PlusPetit&
'*****************

RESTRICTION :
si plusieurs représentants ont une égalité sur le plus petit nombre de dossiers,
seul le premier rencontré sera retenu.

Cordialement.

PMO
Patrick Morange
 
Re : Assigner des dossiers à des représentants

Awwwww mais Oui!!! Il fallait y penser!! Merciiii beaucoup PMO pour ton idée, j'vais essayer de penser à quelque chose pour assigner aléatoirement.. sinon bien il seront en assigner toujours dans le même ordre, c'est très loin d'être la fin du monde =)

Merci encore!
 
Re : Assigner des dossiers à des représentants

Bonjour,

Pour contourner la restriction que j'évoquais lors de mon précédent message,
à savoir
RESTRICTION :
si plusieurs représentants ont une égalité sur le plus petit nombre de dossiers,
seul le premier rencontré sera retenu


voici une piste pour éluder ce problème

'*****************
Dim i&
Dim PlusPetit&
Dim Nom$
Dim T()
Dim cpt%
PlusPetit& = 999999 'un grand nombre fixé de manière arbitraire
'--- Détermine le plus petit ---
For i& = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)
If AgentNameNumber(i&, 1) < PlusPetit& Then
PlusPetit& = AgentNameNumber(i&, 1)
Next i&
'--- Mets le(s) plus petit(s) dans un tableau ---
For i& = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)
If AgentNameNumber(i&, 1) = PlusPetit& Then
cpt%=cpt%+1
ReDim Preserve T(1 To cpt%)
T(cpt%) = AgentNameNumber(i&, 0)
Next i&
'--- Indique aléatoirement un représentant ---
Randomize Timer
MsgBox "Représentant : " & T(Int((cpt% * Rnd) + 1))

'****************


Cordialement.

PMO
Patrick Morange
 
Re : Assigner des dossiers à des représentants

Patrick Morange

Rebonjour Patrick!

Première, je veux te remercier parce que tu m'as vraiment beaucoup aider à date tu n'as pas idée =)... 2ement je voulais te montrer l'adaptation que j'ai fait de ton code et que tu me dises ( si jamais tu passes par ici ) si t'as une idée pourquoi mon Excel gèle depuis cet après-midi quand j'exécute ce sub... voici. De ce que j'en comprends c'est que je crer une genre de boucle infini avec mon Goto Label1 à la fin...

J'ai du rajouter ce Goto parce que par moment (1 fois sur 5) le code me donnait un représentant vide.. soit "" et je ne comprennait pas trop pourquoi alors j'ai rajouté le Goto.. qui fontionnait très bien jusqu'à maintenant.. étrange non? 😛

Code:
Dim AgentNameNumber(0 To 99, 0 To 1) As Variant
Dim FirstCelluleAgentNumber As Variant
Dim NextCelluleAgentNumber As Variant
Dim y As Integer
Dim z As Integer
Dim PlusPetitQue As Long
Dim NomAgent As String
Dim T()
Dim Compteur

'=== Trouve le représentant qui a le moins de dossier ============================

PlusPetitQue = 9999 'un grand nombre fixé de manière arbitraire
Compteur = 1

'--- Détermine le plus petit ---
For z = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)

    If AgentNameNumber(z, 1) < PlusPetitQue Then
        PlusPetitQue = AgentNameNumber(z, 1)
        NomAgent = AgentNameNumber(z, 0)
    End If
    
Next z

Label1:
'--- Mets le(s) plus petit(s) dans un tableau ---
For z = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)

    If AgentNameNumber(z, 1) = PlusPetitQue Then
        If AgentNameNumber(z, 0) <> "" Then
        Compteur = Compteur + 1
            
        ReDim Preserve T(1 To Compteur)
        T(Compteur) = AgentNameNumber(z, 0)
        
        '--- Indique aléatoirement un représentant ---
        Randomize Timer
    
        ComboBoxRepresentant = T(Int(Compteur * Rnd) + 1)
        End If
    Else
    
    ComboBoxRepresentant = NomAgent
    
    End If
Stop
Next z

'--- Refait le calcul ci-haut si jamais aucun représentant est assigné
If ComboBoxRepresentant = "" Then
    GoTo Label1
End If

Giga merci!
 
Re : Assigner des dossiers à des représentants

J'ai fini par trouver 😉 alors je « post » tout le code, si jamais ça peut servir à quelqu'un.. bonne journée à tous et merci encore!

Code:
'LoadAssignationRep & AssignationAuto
Dim AgentNameNumber(0 To 99, 0 To 1) As Variant
Dim FirstCelluleAgentNumber As Variant
Dim NextCelluleAgentNumber As Variant
Dim GigaSelection As Range
Dim y As Integer
Dim z As Integer
Dim PlusPetitQue As Long
Dim NomAgent As String
Dim T()
Dim Compteur

Sub LoadAssignationRep()

ComboBoxRepresentant.Clear

Set MegaSelection = Range(Feuil6.Cells(1, 2), Feuil6.Cells(9999, 2))
Set GigaSelection = Range(Feuil17.Cells(1, 1), Feuil17.Cells(9999, 1))

LastRowAgent = MegaSelection.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

Set FirstCelluleAgent = MegaSelection.Find("3", After:=Feuil6.Cells(1, 2), SearchOrder:=xlByRows, SearchDirection:=xlNext)
ComboBoxRepresentant.AddItem FirstCelluleAgent.Offset(0, -1)

Set FirstCelluleAgentNumber = GigaSelection.Find(FirstCelluleAgent.Offset(0, -1), After:=Feuil17.Cells(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlNext)
AgentNameNumber(0, 0) = FirstCelluleAgent.Offset(0, -1)
AgentNameNumber(0, 1) = FirstCelluleAgentNumber.Offset(0, 9)

NextCelluleAgentRow = MegaSelection.Find("3", After:=Feuil6.Cells(1, 2), SearchOrder:=xlByRows, SearchDirection:=xlNext).Row

y = 1
NextCelluleAgentRow = FirstCelluleAgent.Row
Do Until NextCelluleAgentRow = LastRowAgent
    
    Set NextCelluleAgent = MegaSelection.Find("3", After:=Feuil6.Cells(NextCelluleAgentRow, 2), SearchOrder:=xlByRows, SearchDirection:=xlNext)
        NextCelluleAgentRow = NextCelluleAgent.Row
        ComboBoxRepresentant.AddItem NextCelluleAgent.Offset(0, -1)
        
    Set NextCelluleAgentNumber = GigaSelection.Find(NextCelluleAgent.Offset(0, -1), After:=Feuil17.Cells(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlNext)
        AgentNameNumber(y, 0) = NextCelluleAgent.Offset(0, -1)
        AgentNameNumber(y, 1) = NextCelluleAgentNumber.Offset(0, 9)

        y = y + 1

Loop

AssignationAuto

End Sub

Sub AssignationAuto()

'=== Trouve le représentant qui a le moins de dossier ============================

PlusPetitQue = 9999 'un grand nombre fixé de manière arbitraire
Compteur = 0

'--- Détermine le plus petit ---
For z = LBound(AgentNameNumber, 1) To y - 1 'UBound(AgentNameNumber, 1)

    If AgentNameNumber(z, 1) < PlusPetitQue Then

            PlusPetitQue = AgentNameNumber(z, 1)
            NomAgent = AgentNameNumber(z, 0)

    End If

Next z

Label1:
'--- Mets le(s) plus petit(s) dans un tableau ---
For z = LBound(AgentNameNumber, 1) To y - 1 'UBound(AgentNameNumber, 1)

    If AgentNameNumber(z, 1) = PlusPetitQue Then
    
        Compteur = Compteur + 1
            
        ReDim Preserve T(1 To Compteur)
        T(Compteur) = AgentNameNumber(z, 0)
        
        '--- Indique aléatoirement un représentant ---
        Randomize Timer
    
        ComboBoxRepresentant = T(Int(Compteur * Rnd) + 1)
    
    End If

Next z

End Sub
 
Dernière édition:
Re : Assigner des dossiers à des représentants

Bonjour,

Peut-être s'agit-il de cellules vides au sein de la feuille servant de source à votre tableau "AgentNameNumber".

Si c'est le cas
1) les vides (nombre de dossiers) sont interprétés comme 0 et cela affecte directement la variable "PlusPetitQue"
2) si le nombre de dossiers est valide et que le nom du représentant = rien, on aura un résultat vide si nombre de dossiers = PlusPetitQue

Pour éviter cela, voici mon code avec quelques lignes modifiées

Code:
Dim i&
Dim PlusPetit&
Dim Nom$
Dim T()
Dim cpt%
PlusPetit& = 999999 'un grand nombre fixé de manière arbitraire
'--- Détermine le plus petit ---
For i& = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)
[COLOR="Red"]
    '/// Evite l'interprétation de RIEN comme ZERO  ///
  If AgentNameNumber(i&, 1) <> "" Then
[/COLOR]  
    If AgentNameNumber(i&, 1) < PlusPetit& Then _
      PlusPetit& = AgentNameNumber(i&, 1)
[COLOR="red"]
  End If
[/COLOR]  
Next i&
'--- Mets le(s) plus petit(s) dans un tableau ---
For i& = LBound(AgentNameNumber, 1) To UBound(AgentNameNumber, 1)
[COLOR="red"]
    '/// Evite l'interprétation de RIEN comme ZERO  ///
    '/// Evite si plus petit existe MAIS nom = RIEN ///
  If AgentNameNumber(i&, 1) <> "" And AgentNameNumber(i&, 2) <> "" Then
[/COLOR]
    If AgentNameNumber(i&, 1) = PlusPetit& Then
      cpt% = cpt% + 1
      ReDim Preserve T(1 To cpt%)
      T(cpt%) = AgentNameNumber(i&, 0)
    End If
[COLOR="red"]    
  End If
[/COLOR]
Next i&
'--- Indique aléatoirement un représentant ---
Randomize Timer
MsgBox "Représentant : " & T(Int((cpt% * Rnd) + 1))

Cordialement.

PMO
Patrick Morange
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

S
Réponses
0
Affichages
788
S
D
Réponses
10
Affichages
10 K
Droopy75
D
Retour