Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: random ploegindeling  (gelezen 9188 keer)

0 leden en 1 gast bekijken dit topic.

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
random ploegindeling
« Gepost op: 27 maart 2007, 22:02:51 »
Veronderstel dat men ploegen van max. elk 3 man wil samenstellen (willekeurig verdeeld en dit voor minstens een 7-tal spellen : bv.
bij 21 spelers : 7 ploegen van 3 man
bij 22 spelers : 6 ploegen van 3 man + 2 ploegen van 2 man
bij 23 spelers : 7 ploegen van 3 man + 1 ploeg van 2 man, enz...
Vraag :
- Random indelen van ploegen over bv. 7 spellen.
- Ook mag het niet zijn dat de ploegen van 2 man altijd de laatste ploegen zijn (in dit geval ploeg 7 en/of 8).
Bedoeling is dat deze reeks van getallen (ploegen) onder elkaar in 1 kolom komt per spel (dus 7 spellen = 7 kolommen). In kolom 1 bij 22 spelers komt dan bv. :
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 1 - 2 - 4 - 5 - 6 - 7 - 8 - 1 - 2 - 3 - 4 - 5 - 6 - 8 maar deze getallen dienen wel ad random door elkaar te staan en hier zijn bv. ploeg 3 en 7 van 2 man.

1° Kan deze reeks autmatisch gegenereerd worden in variabelen of wordt dit als een getallenreeks opgeslagen?
2° Hoe deze dan in meerder kolommen brengen?
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.284
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: random ploegindeling
« Reactie #1 Gepost op: 28 maart 2007, 08:59:44 »
Justaguy, voor de gein heb ik (ff vlug voor werktijd :)) een stukkie in elkaar gedraaid die je aantal teams berekent op het aantal spelers dat je opgeeft in cel A1.
Sub VerdeelPloegen()
Dim iAantSpelers As Integer, iPloegDrie As Integer, iPloegTwee As Integer

    iAantSpelers = Range("A1").Value
   
    If iAantSpelers Mod 3 = 1 Then
        iPloegDrie = iAantSpelers - 4
        iPloegDrie = iPloegDrie / 3
    Else:
        iPloegDrie = Int(iAantSpelers / 3)
    End If
       
    iPloegTwee = (iAantSpelers - (iPloegDrie * 3)) / 2
   
    MsgBox "Met " & iAantSpelers & " spelers heb je " & iPloegTwee + iPloegDrie & " ploegen." & Chr(13) & Chr(13) & _
                "(" & iPloegTwee & " ploeg(en) van twee man)" & Chr(13) & _
                "(" & iPloegDrie & " ploeg(en) van drie man)", , "Ploegen"

       
End Sub
Zie ook de bijlage...


Misschien een beginnetje van iets moois?  8)

Ik denk dat je je kolommen moet vullen met getallen reeksen die je in een Array zet en ze zo per kolom ad random laat afdrukken...

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: random ploegindeling
« Reactie #2 Gepost op: 28 maart 2007, 22:15:26 »
Justaguy,

Je probleem is voor mij niet duidelijk. Bedoel je dat de ploegen steeds wisselen per spel, zodat iedereen steeds met ander ploeggenoten speelt?

Waarom moeten die 22 getallen in een kolom staan door elkaar  ???
En waarom: "de ploegen van 2 man mogen niet altijd de laatste ploegen zijn"

Kan je eens een volledig uitgewerkt voorbeeld geven met een kleiner aantal mensen om het overzichtelijker te maken?
Is het ook niet logischer om namen te noemen bij je indeling dan ploegnummers?

Enfin, 'k wil wel helpen, als ik snap waar je naartoe wil.

beste groeten,
Erik

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
Re: random ploegindeling
« Reactie #3 Gepost op: 29 maart 2007, 21:07:31 »
Citaat
Bedoel je dat de ploegen steeds wisselen per spel, zodat iedereen steeds met ander ploeggenoten speelt?
Yup, dat bedoel ik als dusdanig. De bedoeling is te spelen "à la mêlée" zoals de fransen het zeggen, dus ieder spel met andere teamgenoten tegen ander deelnemers. Dit om het sociaal contact en het vooraf afspreken van 'sterke' ploegen tegen te gaan. Dus ieder spel is een verrassing met wie je tegen wie speelt (je bent er voorstander van of niet, natuurlijk).

Citaat
Waarom moeten die 22 getallen in een kolom staan door elkaar?

Zie voorbeeld als bijlage : Er zijn bv. 22 deelnemers en het is de bedoeling bij het begin van het 1ste spel de ploegindeling uit te loten (dit via een macro). De getallen moeten DOOR ELKAAR staan want anders krijg je misschien een combinatie dat je wel in een ander ploegnummer speelt maar wel met dezelfde teamgenoten (zie "ahum" slecht voorbeeld)

Citaat
En waarom: "de ploegen van 2 man mogen niet altijd de laatste ploegen zijn"]

Bv. Ploeg 1 speelt tegen ploeg 2, ploeg 3 tegen ploeg 4, enz. Dikwijls worden de ploegen ingedeeld ook volgens de beschikbare terreinen. Bv. ploegen 1 <> 2 op terrein 1, ploegen 3 <> 4 op terrein 2, enz. Dus op het laatste terrein zou dan (bij ploegen met 2 man) altijd met de kleinste ploegen gespeeld worden (kan voordeel zijn : want 2 man (elk 3 ballen) spelen tegen 3 man (elk 2 ballen). Is misschien dom voorbeeld maar voor het genereren van de getallen kun je misschien gebruik maken van de formule in het voorbeeld; alleen staan ze niet op de juiste plaats (zi hierboven voor zelfde teamgenoten)

Of ook de macro hierboven kan misschien gebruikt worden om te getallen te genereren.

Maar mijn probleem is hoe deze getallen te stockeren om daarna willekeurig deze in een kolom onder elkaar te plaatsen?
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
Re: random ploegindeling
« Reactie #4 Gepost op: 29 maart 2007, 21:08:15 »
Oeps, was de bijlage vergeten waarbij excuses :P
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.284
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: random ploegindeling
« Reactie #5 Gepost op: 30 maart 2007, 00:41:12 »
Justaguy, volgens mij heb ik de (een?) oplossing voor je gevonden. De code kan wellicht nog wat mooier, maar ik vond 't al heel wat... ;D

Starten van de 'ranking' doe je dmv de knop die in de sheet staat. Je krijgt dan de msgbox die vermeldt hoeveel ploegen je hebt. Ik heb er ff een timerfunctie (wait) in gezet om te tonen wat tie doet. Die kan je er uiteraard uitslopen en voor de for-next lus kan je ook nog de 'application.screenupdating = false' invoegen (vergeet 'm niet daarna op 'true' te zetten).

Vind je 't wat?

Groet, Leo

p.s. je eigen 'test.xls' bestand kon niet gebruikt worden omdat je een password op de VBE had zitten... Ik hoop niet dat je hiermee dingen kwijt bent.

UPDATE 11/08/2015.... Volgens een vraagsteller is de bijlage niet meer bruikbaar. Hierbij de link naar een nieuw draadje met daarin de bestanden van dit draadje...
______________________________

Groet, Leo

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
Re: random ploegindeling
« Reactie #6 Gepost op: 30 maart 2007, 20:36:09 »
Nou RedHead, dat is zeker al wat...
Toch nog 2 vraagjes :
- Hoe ben je op het idee gekomen gebruik t maken van deze formule  ???

- Alles goed nagekeken (om de werking ervan te begrijpen) en alles werkt naar behoren. Een miniscuul minpuntje is dat bij ploegen van 2 man altijd de eerste ploeg en bij 2 ploegen van 2 man de 1ste en de laatste ploeg altijd genomen worden. Ligt waarschijnlijk aan de formule maar ben ik er nog niet uit hoe dit komt. :-\

Alleszins, CHAPEAU !!!
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.284
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: random ploegindeling
« Reactie #7 Gepost op: 31 maart 2007, 08:55:36 »
Justaguy, Dank voor de...
Citaat
CHAPEAU !!!
Graag gedaan! ;)

Dan je vragen....
Citaat
Hoe ben je op het idee gekomen gebruik t maken van deze formule 
Zoals ik je in mijn 1e antwoord aangaf, zou je volgens mij eea kunnen oplossen met een VBA-array. Maar aangezien ik dat nog maar 'half half' begrijp, viel dat niet mee om m'n idee uit te werken. Vandaar dat ik ben gaan wegschrijven naar de worksheet. In 1e instantie heb ik geprobeerd om een Rnd (random getal) tussen de 1 en iAantalPloegen te gebruiken. De ellende daarvan is dat je dan (grote) kans hebt op 'dubbele' getallen in een reeks (bijvoorbeeld bij 8 ploegen: 1-2-3-3-4-5-6-7). Dat werkte dus niet. Met een beetje door rommelen zag ik dat Rnd (als je het getal niet als een integer weergeeft) een getal achter de komma genereerd met een preciesie van 15. De kans dat je daar dus een gelijk getal treft, is miniem!
Ok, tot zover was het dus mogelijk om net zoveel verschillende getallen te generenen als dat er deelnemers zijn.
Nu de formule (startend in cel AC6): =MOD(RANK(AC6;AC:AC);6)+1Om er nu voor te zorgen dat er een ploegnummer aan dit random getal wordt toegevoegd heb ik gebruik gemaakt van de functie Rank (rang). Deze kijkt in een opgegeven range naar de positie van het aangegeven getal in die range (voorbeeld: range van getallen: 10-30-50-60-90; ik zoek naar de positie van getal 60; dan geeft Rank als resultaat: 4).
Dat spelletje ging natuurlijk niet op als je 22 verschillende getallen hebt, en 8 ploegen. Rank zal dus de posities 1 t/m 22 tonen. Om dit te ondervangen maak ik gebruik van de functie Mod (rest) met als deler het iAantalPloegen (in voorbeeld: 6). In dit geval zal Mod het gevonden Rank-getal gaan delen door 6 en het restant tonen. Maarrrrr... Mod gaat alleen werken als het 'te delen getal' echt te delen is door de deler, anders geeft Mod het gezochte getal terug (voorbeeld: reeks is: 1-2-3-4-5-6-7-8-...; resultaat: 1-2-3-4-5-0-1-2-...). Je ziet dus dat de 'rest' het integer-getal is dat overblijft na deling zolang het resultaat boven de nul blijft. (hmmm... moeilijke uitleg... 8) misschien handig om in Excel ff via help op 'rest functie' te zoeken). Maar goed via de functie Mod kan je dus in 'cirkeltjes' blijven draaien, en zo de ploegen verdelen over de range van deelnemers. O ja, als laatste tel ik dan bij het resultaat nog 1 op om het ploegnummer nul kwijt te raken. ;D

Voor wat betreft je '2-mans-ploegen'... Dat zal inderdaad met de Mod-formule te maken hebben. Maar volgens mij maakt het niet uit dat het altijd de 1e en/of de laatste zijn. De verdeling van de ploegnummers vindt vervolgens toch ad random over de deelnemers plaats.

Mog je nog vragen hebben, stel ze gerust..

Groet, Leo

P.s. Misschien dat Erik de afhandeling nog volledig binnen VBA kan houden ipv het wegschrijven naar de sheet?
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: random ploegindeling
« Reactie #8 Gepost op: 02 april 2007, 11:43:11 »
Hallo,

'k Had weining energie om piano te studeren - wellicht nawerking zomeruur -, dus even Excelitis laten opkomen...
In bijlage vind je een werkversie: doordat alles vlak naast elkaar staat heb je een goed overzicht van het effect. De voorwaardelijke opmaak toont ook welke ploegen 2 man hebben. Verder zit er nog voorwaardelijke opmaak (rood) om fouten te tonen (ploegen die geen 3 man hebben), beter gezegd om te laten zien dat alles OK is. Dit was erg handig tijdens het testen. Zo te zien is alles dus OK.
De "kleine ploegen" schuiven dus door. Voorbeeld: eerst bestaan ploegen 6 & 7 uit 2 man. Daarna 4 & 5, enzoverder.
Option Explicit

Sub VerdeelPloegen()
'Erik Van Geit
'070402
'code bevat geen errorhandling voor te klein aantal spelers

'GEGEVEN
'spelerlijst in A1:Ax   (x = laatste rij)
'RESULTAAT
'random teamverdeling per 3, indien nodig per 2
'teamnummers in B1:Ix
'VOORBEELD
'speler 1    2   2   3   2   2   3   1
'speler 2    3   3   2   3   3   2   2
'speler 3    1   3   1   1   3   3   3
'speler 4    3   1   2   2   1   1   1
'speler 5    2   2   3   1   3   2   2
'speler 6    1   1   2   3   1   2   1
'speler 7    1   3   1   2   1   1   3
'speler 8    2   1   3   1   2   3   2

Dim cnt As Long, t3 As Long, t2 As Long
Dim arr As Variant
Dim i As Long, j As Long, k As Integer, l As Integer

'**** EDIT ****
Const ronden As Integer = 7
'**** END EDIT ****

'aantal ploegen van 2 en 3
    cnt = Range("A" & Rows.Count).End(xlUp).Row
    Select Case cnt Mod 3
    Case 0: t3 = cnt / 3
    Case 1: t3 = (cnt - 4) / 3: t2 = 2
    Case 2: t3 = (cnt - 2) / 3: t2 = 1
    End Select

'maak matrix
'voorbeeld: 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5
    ReDim arr(1 To cnt)
    For j = 1 To t3
    l = l + 1
        For k = 1 To 3
        i = i + 1
        arr(i) = l
        Next k
    Next j
    For j = 1 To t2
    l = l + 1
        For k = 1 To 2
        i = i + 1
        arr(i) = l
        Next k
    Next j

Application.ScreenUpdating = False

    Columns("B:I").ClearContents

    For i = 2 To ronden
    'random sorteren matrix
    Range(Cells(1, i), Cells(cnt, i)) = Application.Transpose(arrOut(arr))
        'kleinste ploegen schuiven door
        For j = 1 To cnt
        arr(j) = IIf(arr(j) < t2 + 1, l, 0) + arr(j) - t2
        Next j
    Next i

Application.ScreenUpdating = True

End Sub


Private Function arrOut(arrIn As Variant) As Variant

Dim cnt As Long, i As Long, pick As Long
Dim temp As Variant

cnt = UBound(arrIn, 1)
ReDim temp(1 To cnt)
Randomize

    For i = 1 To cnt
    pick = Int(cnt * Rnd) + 1
    temp(i) = arrIn(pick)
    arrIn(pick) = arrIn(cnt)
    arrIn(cnt) = temp(i)
    cnt = cnt - 1
    Next

arrOut = temp

End Function
Om er meer van te begrijpen kan je de code doorlopen met functietoets F8. Neem dan een klein aantal spelers.

beste groeten,
Erik

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
Re: random ploegindeling
« Reactie #9 Gepost op: 03 april 2007, 20:32:20 »
Hallo Eric,
nou dat is een zware brok die ik voorgeschoteld kreeg. Van arrays snap ik niet veel. Ook gaat er blijkbaar iets mis als na het importeren van de macro (arr(i) = 1 valt blijkbaar buiten bereik ???).
Volgens uw schrijven werkte bij u alles perfect. Is het mogelijk deze als bijlage door te sturen ofwel na te kijken wat er bij mij misloopt?

Hopelijk is uw excelitis niet gauw genezen zodat we op meerdere zulke snufjes mogen rekenen op deze site ;)

Groetjes,
Guy.
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline Justaguy

  • Lid
  • *
  • Berichten: 86
  • Wie zoekt, die vindt ... het in Oplossing.be
Re: random ploegindeling
« Reactie #10 Gepost op: 03 april 2007, 20:36:36 »
Sorry Eric,

zat met een dikke vlieg in mijn ogen. Ik was zodanig verbaasd over de code en wilde deze direct uitproberen zodat ik de bijlage over het hoofd zag.
'k ga er direct invliegen, zeg.
SYSTEEM: AMD Athlon 1Ghz - 256Mb RAM - Win XP - Office2003 – kabel)

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: random ploegindeling
« Reactie #11 Gepost op: 04 april 2007, 10:59:24 »
Ik had ook effe een vlieg, want wilde al schrijven dat er een bijlage was.
Als dit goed voor jou werkt, denk ik dat het eenvoudig is om het naar jouw situatie om te zetten.

1. De "for next" krijgt dan een STEP-argument en ziet er dan uit zoals
For i = 2 To ronden Step 32. Je zal ook nog wat spelen met de bereiken, wat dan resulteert in iets als
Range(Cells(3, i), Cells(cnt + 2, i))

beste Excel-groet,
Erik

PS: toevoegen van war "error-handling" is ook gewenst: als er bijvoorbeeld 1 of geen spelers zijn, krijg je een BUG

 


www.combell.com