tirage aléatoire vba

asta22

New Member
Joined
Apr 13, 2022
Messages
12
Office Version
  1. 365
Platform
  1. Windows
je veux sélectionner aléatoirement 1 personne disponible dans mon tableau pour les 13 samedis
range(A64:O70) pour la disponibilité ( qui contient des valeurs 1 et 0)
range(P64:AP70) pour les affectations
"1" ça veut dire disponible," 0" indisponible
voilà le fichier

Merci d'avance
 

Excel Facts

Round to nearest half hour?
Use =MROUND(A2,"0:30") to round to nearest half hour. Use =CEILING(A2,"0:30") to round to next half hour.
apparament, il-y-a des problemes avec le link.
Oops! We ran into some problems.
 
Upvote 0
re bonjour
 
Upvote 0
pour des telles problèmes, on utilise "Solver" mais on doit ajouter des references dans VBA-editor (peut-être trop compliqué ?)
Donc une solution (pas 100% perfect) avec un macro
example file
VBA Code:
Sub random()

     'see https://excelmacromastery.com/vba-arraylist/

     Dim rij(), kolom()
     a0 = Range("C65:O70")     '---> les disponibles, je supposes.
     a = a0     'copy de cet array
     ReDim rij(1 To UBound(a))     'prepare array des lignes
     ReDim kolom(1 To UBound(a, 2))     'prepare array des columns
     Set sca = CreateObject("system.collections.arraylist")     'prepare a sorted arraylist
     best = 1E+99     'meilleur solution jusqu'à maintenant = chiffre enorme

     For ptr1 = 1 To 100     'loop plusieurs solutions
          For ptr2 = 1 To 100     'loop dans une solution
               sca.Clear     'vider le SCA
               For i = 1 To UBound(a): rij(i) = Application.Sum(Application.Index(a, i, 0)): Next     'nombre the 1's dans chaque ligne = normbre de fois une personne est assignée
               For i = 1 To UBound(a, 2): kolom(i) = Application.Sum(Application.Index(a, 0, i)): Next     'nombre de 1's dans une column = nombre de personnes assignées dans une semaine

               For i = 1 To UBound(a)     'loop personnes
                    For j = 1 To UBound(a, 2)     'loop semaines
                         sca.Add Join(Array(Format(Rnd + a(i, j) * rij(i) * kolom(j), "000.0000000000000"), i, j), "|")     'add a poids pour tous les possibilités présents
                    Next
               Next
               sca.Sort     'sort ascending
               sca.Reverse     'sort reversed
               a1 = sca.toarray     'read SCA dans un array
               For k = 0 To UBound(a1)     'loop dans les possibilités à partir avec celui avec le poids le plus grand (=personne avec plus d'assignements dans une semaine trop peuplé)
                    sp = Split(a1(0), "|")     'split possibilié
                    b = (rij(sp(1)) > 2) * (kolom(sp(2)) > 1)     'personne avec plus de 2 assignements dans une semaine avec plus d'une personne assignée ?
                    If b Then a(sp(1), sp(2)) = 0: Exit For     'Oui ? alors effacer
               Next
               If b = 0 Then Exit For     's'on n'a pas pu effacer une possibilité, arrëtez !
          Next

          For i = 1 To UBound(a): rij(i) = Application.Sum(Application.Index(a, i, 0)): Next     'nombre de fois une personne est assignée
          For i = 1 To UBound(a, 2): kolom(i) = Application.Sum(Application.Index(a, 0, i)): Next     'nombre de personnes par semaine
          If Application.Max(kolom) < best Then     'prend la meilleur solution (moindre de personne par semaine)
               Range("C80").Resize(UBound(a), UBound(a, 2)).Value = a     'copy array to feuille
               best = Application.Max(kolom)     'nouvelle meilleur solution
               If best = 1 Then Exit For
          End If
     Next
     
End Sub
 
Upvote 0
bonsoir
merci pour ton retour,
donc c'est une macro de solver ?
 
Upvote 0
non, solver est encore manuel, on peut l'autmatiser, mais la méthode est plutôt compliquée et ne donne pas toujours de résultat.
l'autre macro essaie d'effacer de 1's mais n'est pas toujours capable de'effacer le dernier.
Il essaie que tout le monde travaille en moyenne le même nombre.

Il y a une autre methode que j'ai vu sur le site francophone, qui est beaucoup plus simple, mais qui n'essaie pas cet equilibre.
 
Upvote 0

Forum statistics

Threads
1,215,338
Messages
6,124,358
Members
449,155
Latest member
ravioli44

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top