XL 2019 Attribution valeur aléatoire dans une liste sans doublons.

Zhavina

XLDnaute Nouveau
Bonjour,
Je travail dans une boite avec les lignes de productions possédant chacune plusieurs postes de travail.
J'aurais besoin de pouvoir attribuer à chaque membre de mon équipe un poste de façon aléatoire sans que 2 personnes ait le même poste évidemment.
Petite difficultés supplémentaire : il faudrait que les premiers postes de la ligne soient attribués en priorité, s'ils sont utilisables.

Exemple :
Jour 1 : J'ai la ligne 1 qui possède 20 postes. Je dois y placer 10 personnes. Je voudrais que les 10 personnes soient placés aléatoirement uniquement sur les 10 premiers.
Jour 2 : Le poste 3 de la ligne 1 est inutilisable suite à un soucis matériel et j'ai cette fois 6 personnes à placer. Je voudrais les placer aléatoirement sans que personne ne soit sur le poste 18 19 20 mais non plus sur le 3 qui est inutilisable.

Je vous ais joint en pièce jointe un exemple de ce à quoi ressemble mon fichier.

Je comprend les fonction alea.entre.bornes et index.
Sauf que la fonction index, quand il n'y a pas de données dans une case, affiche une valeur 0. Ce qui fait que si la fonction tombe sur une case vide, un des membre de mon équipe n'aura pas de poste attribué.

Merci beaucoup pour votre aide.
 

Pièces jointes

  • ExemplePosteAlea.xlsx
    13.8 KB · Affichages: 8

Dranreb

XLDnaute Barbatruc
Ne pourriez vous essayer quand même, quitte à me poser d'autres questions s'il y a d'autre détails que vous ne comprenez pas ?
Remarque: vous n'avez plus du tout besoin de la fonction ALEA() ni de tris avec un objet ListeAléat.
Il contient des numéros en ordre aléatoire que vous pouvez y puiser, puis les en évacuer s'il conviennent pour être sûr de ne plus les y retrouver par la suite.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Pour établir un masque à partir d'un ensemble d'éléments pouvant ne pas être vides vous pouvez utiliser cette fonction :
VB:
Function CombinBinCoches(ByVal Postes) As Long
   Dim X, P As Byte
   For Each X In Postes
      If Not IsEmpty(X) Then CombinBinCoches = CombinBinCoches Or 2& ^ P
      P = P + 1: Next X
   End Function
Postes peut comporter jusqu'à 31 éléments.
 

Zhavina

XLDnaute Nouveau
Pour l'instant je n'ai réussi à qu'a retranscire la solution en #8.
De plus et je ne sais pas si c'était prévu mais celle çi partage de façon égale toutes les lignes. Ce dont j'avais besoin aussi.

La solution en #25 ne permet pas de faire un filtrage des coches (ou en tout cas je n'y arrive pas), est-ce normal ? Car c'est une fonctionnalité que je souhaite garder.
 

Pièces jointes

  • HeraklesNightAUTO.xlsm
    948.5 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Vous n'avez toujours pas corrigé ce commentaire idiot ' Si une case est vide alors... il va à la suivante s'il y en a une.
C'est plutôt ' Si une case n'est pas vide alors il va retenir cette case suivante là, si toutefois elle ne sort pas du cadre de ce qu'il reste à attribuer.
Mais ce dernier test n'a plus lieu d'être: je conserve désormais toutes les valeurs non vides trouvées.
J'arrête seulement de l'explorer ensuite s'il ne reste plus personne à qui les attribuer.

Voir fonction poste #33 pour construire un masque à partir de coches.

Vous auriez intérêt à renommer vos objets Worksheet, sinon on risque d'oublier de les adapter, vu que Feuil1, Feuil2 etc. ne veut rien dire. Par exemple je renomme Feuil2 en WshPostDisp puisqu'il représente la feuille "Postes Dispos".
L'acquisition de ceux ci devrait alors pouvoir s'écrire comme ça :
VB:
Rem. Acquisition Codes et CombBinTyp par ordre de préférence
   TDon = WshPostDisp.[A1:Q22].Value
   ReDim TCmbCol(1 To UBound(TDon, 2)), TCodes(1 To 4096), TCmbTyp(1 To 4096)
   For C = 1 To UBound(TDon, 2)
      Select Case TDon(1, C): Case "Decant": TCmbCol(C) = 1: Case "Receive": TCmbCol(C) = 2
         Case "Prep": TCmbCol(C) = "4": Case "NPC": TCmbCol(C) = 8: End Select: Next C
   For L = 3 To UBound(TDon, 1)
      For C = 1 To UBound(TDon, 2)
         If TDon(L, C) <> "" Then
            NMax = NMax + 1
            TCodes(NMax) = TDon(L, C)
            TCmbTyp(NMax) = TCmbCol(C)
            End If: Next C, L
   ReDim Preserve TCodes(1 To NMax), TCmbTyp(1 To NMax)

Ça ne va pas faciliter les chose d'avoir éclaté dans plusieurs feuilles les personnes à qui attribuer ces postes. Ça devient même trop compliqué comme ça. Je crois que je ne vais plus intervenir dans cette affaire.
 
Dernière édition:

Zhavina

XLDnaute Nouveau
Je suis de retour.
Je suis revenu sur la première solution que tu m'avais proposé Dranreb. Car avec mes compétences actuelle c'est la seule que je peux comprendre et modifier. Et surtout j'aimerais rester avec mon système de "x" pour afficher les compétences de mon équipe.

J'ai donc annoté ton code, et je voudrais savoir si ceux si sont correct. Et s'il est possible d'utiliser cette base pour ensuite leur attribuer un poste selon leur compétences.

VB:
Option Explicit

Sub TirageReceiveDecant()
   Dim NMax As Long, LAt As New ListeAléat, TDon(), L As Long, C As Long, N As Long
   NMax = Feuil1.[A1000].End(xlUp).Row - 1 'Nombre de ligne utilisé -1 à cause de l'entête
   LAt.Init NMax
   TDon = Feuil2.[A3:K19].Value 'Creation du tableau de A3 à K19
   ReDim TRés(1 To NMax, 1 To 1)
   For L = 1 To UBound(TDon, 1) 'On cherche dans la ligne L...
      For C = 1 To UBound(TDon, 2) '...Puis dans la colonne C
         If TDon(L, C) <> "" Then 'Si le résultat de TDon est différent de vide...
            N = N + 1: If N > NMax Then Exit For '...il va produire ce prochain N. Si N est supérieur au nombre d'AA alors exit.
            TRés(LAt.Aléat(N), 1) = TDon(L, C) '...Sinon il va mettre dans TRés le poste trouvé.
            End If
         Next C: If N > NMax Then Exit For
      Next L
   Feuil1.[E2].Resize(NMax).Value = TRés 'Affiche TRés dans la feuille 1 à partir de E2
   End Sub

Merci d'avance :)
 

Dranreb

XLDnaute Barbatruc
Il faut créer un masque des compétences requises pour chaque ensemble de postes, en plus du masque des compétences des gens à qui les attribuer. Mais si vous faites ça séparément pour chaque groupe de colonnes il ne va pas être possible de savoir ce qui aura déjà été attribué lors d'autres traitements, ni à qui.
 
Dernière édition:

Zhavina

XLDnaute Nouveau
Non pas du tout lol.

je vais clore le sujet ici car je me rend compte que m'a demande initiale a été résolue. Et je ferais un autre sujet pour second problème pour éviter de dévier du problème initial.

J'oublie pas d'indiquer la réponse qui m'a le plus aidé.
Merci Dranreb !
 

Dranreb

XLDnaute Barbatruc
Toutes les données sont enregistrées sous une forme ou une autre en binaire dans la mémoire d'un ordinateur.
Un bit est la plus petite unité élémentaire d'information pouvant être dans seulement deux états électroniques valant conventionnellement 1 ou 0. Un groupe de 8 bits, appelé octet en français et byte en anglais, est la plus petite information adressable en mémoire. L'hexadécimal est une manière courante de représenter des configuration de bits car un chiffre y représente 4 bits. Je joins ce classeur parce qu'il comporte en commentaires de cellules des informations qui pourront vous être utiles sur la manière dont sont codés les nombres dans Excel et dans VBA.
 

Pièces jointes

  • ValeursExcelVsVBA.xlsm
    84.3 KB · Affichages: 3
Dernière édition:

Discussions similaires

Réponses
6
Affichages
960