Getallen sorteren op random
-
franç - Lid geworden op: 10 jul 2003, 12:34
@drumeke,
Als ik de video goed begrepen heb, dan doet Kutools niet meer dan wat ik hierboven veronderstelde, namelijk een lijst in willekeurige volgorde sorteren. Maar daar heb je Kutools niet voor nodig, die functie zit standaard al in Excel En personen steeds eenzelfde nummer laten behouden, dat hoeft geen probleem te zijn. In plaats van een random lijst met nummers, kun je trouwens ook een random lijst met namen aanmaken. Dan heb je zelfs geen nummers nodig (als je dat zou willen).
Ik zie dat aan elk veld 6 personen worden 'toegewezen'. Om welk spel of bezigheid gaat het hier?
Als je probleem inmiddels is opgelost, laat dat hier dan even weten a.u.b., dan hoef ik verder niet meer te reageren.
Als ik de video goed begrepen heb, dan doet Kutools niet meer dan wat ik hierboven veronderstelde, namelijk een lijst in willekeurige volgorde sorteren. Maar daar heb je Kutools niet voor nodig, die functie zit standaard al in Excel En personen steeds eenzelfde nummer laten behouden, dat hoeft geen probleem te zijn. In plaats van een random lijst met nummers, kun je trouwens ook een random lijst met namen aanmaken. Dan heb je zelfs geen nummers nodig (als je dat zou willen).
Ik zie dat aan elk veld 6 personen worden 'toegewezen'. Om welk spel of bezigheid gaat het hier?
Als je probleem inmiddels is opgelost, laat dat hier dan even weten a.u.b., dan hoef ik verder niet meer te reageren.
Laatst gewijzigd door franç op 30 apr 2022, 20:55, 2 keer totaal gewijzigd.
-
lode - Lid geworden op: 13 mar 2005, 16:14
Zeer juist Danny.
1) HP Pavilion P6 2030 be/WIN 7 Home-Premium SP1 / Intel Core i5 2500-3.3GHz/ 8Gb /HD1.5Tb / Externe HD 4TB
2) HP Envy Win 11 / Intel Core I7 / 16 GB/ SSD 256 GB/ HD 1 TB
/Firefox/MS Office 2013/ OpenOffice/ LibreOffice/ Eset Smart Security Premium V17
2) HP Envy Win 11 / Intel Core I7 / 16 GB/ SSD 256 GB/ HD 1 TB
/Firefox/MS Office 2013/ OpenOffice/ LibreOffice/ Eset Smart Security Premium V17
-
Danny. - Lid geworden op: 15 mei 2003, 21:42
- Locatie: Vlaams Brabant
Inderdaad Lode, als nieuwkomer (maar toch welkome gast) zomaar iemand naar een andere (duistere??) site willen weglokken, daar heb ik het moeilijk mee.
Groetjes
Danny
Windows 11 Home 64-bit, Ram 8GB, Medion Akoya E23403 All-In-One, Microsoft Defender
-
franç - Lid geworden op: 10 jul 2003, 12:34
De vragensteller reageert al een tijd niet meer en heeft vermoedelijk buiten dit forum een oplossing gevonden. Daarom geef ik hier voor andere geïnteresseerden weer hoe men eenvoudig een randomlijst met getallen of namen kan maken.
1. Voer in kolom A alle gewenste namen of nummers in. Om het voorbeeld eenvoudig te houden ga ik uit van 30 namen of nummers (het mogen er ook meer of minder zijn, maar dan moet je dat getal aanpassen in de formule onder punt 3). Ik ga er ook vanuit dat je de invoer begint in A2, maar ook dat kan je natuurlijk aanpassen. Met 30 namen of getallen worden de cellen A2:A31 gevuld.
2. Typ in B2: =aselect() en kopieer naar beneden in kolom B tot en met B31.
Dat geeft als resultaat een randomlijst met getallen met 6 decimalen. Die kolom (kolom B) kun je eventueel verbergen).
3. Typ in C2: =index($A$2:$A$31;rang(B2;$B$2:$B$31)) en kopieer naar beneden in kolom C tot en met C31 (Let goed op dat je de formule letterlijk overneemt (dus mét dollartekens), dat je die plaatst in C2, en daarna naar beneden kopieert).
4. Voilá, nu heb je in kolom C een willekeurig gesorteerde lijst waarin geen dubbele namen of nummers voorkomen. Telkens dat je op de functietoets F9 drukt, verschijnt er een nieuwe randomlijst. MAAR: dat gebeurt niet alleen als je op F9 drukt, dat is ook het geval als je een willekeurige andere bewerking doet in het werkblad (test dat even). Dat is natuurlijk niet handig, want je zult met een gemaakte randomlijst verder willen werken (bv. die kopiëren naar elders, zoals de vragensteller in dit topic wil).
5. Daarom moet je die lijst in kolom C kopiëren en plakken zonder formules, dan verandert hij niet meer. Dat kan als volgt:
- Selecteer C2:C31 en klik in het lint op "Kopiëren",
- Selecteer dan D2:D31 en kies in het menu: "Plakken - Plakken speciaal - Waarden". Druk daarna 1 keer op de Esc-toets en selecteer een willekeurige andere cel. (Merk op dat de lijst in kolom D anders gesorteerd is dan die in kolom C, maar dat is geen probleem).
6. Nu heb je in kolom D alle namen of nummers die door andere acties niet meer kunnen wijzigen. Vanuit kolom D kun je de gegevens naar elke willekeurige andere plaats kopiëren in hetzelfde- of in een ander werkblad (dat zie je gebeuren in de video waarnaar de vragensteller in zijn bericht van 29-04-2022, 20:06 uur verwees). Je ziet dat er geen andere toepassingen (zoals bv. Kutools) nodig zijn om te kunnen bereiken wat je wil.
7. Wil je een nieuwe randomlijst, dan druk je 1 keer op F9. In kolom C verschijnt dan die lijst die je weer moet kopiëren en plakken in kolom D, waarna je vandaar de gegevens kunt kopiëren naar andere plaatsen.
8. Alles wat hierboven staat kun je in een macro onderbrengen, dan gebeurt het automatisch. Je kunt daarvoor de macrorecorder gebruiken (dan hoef je geen vba te kennen, maar krijg je ook erg veel onnodige coderegels). Beter is uiteraard de vba-code zelf te schrijven, er kan dan - indien nodig - ook rekening gehouden worden met namen of nummers die je niet 'mee wil nemen' in de lijst . Om dat te doen, moet je wel vba kennen en dan vergt dat de nodige uren. Maar dan heb je wel met 1 klik en in 1 seconde de gewenste weergave, precies zoals je die wil. Overigens is het nog beter om de randomberekening in het geheugen uit te voeren en van daaruit de gegevens in de gewenste cellen te plaatsen. Maar dat levert geen ander resultaat op en de uitvoering zal geen halve seconde korter duren.
1. Voer in kolom A alle gewenste namen of nummers in. Om het voorbeeld eenvoudig te houden ga ik uit van 30 namen of nummers (het mogen er ook meer of minder zijn, maar dan moet je dat getal aanpassen in de formule onder punt 3). Ik ga er ook vanuit dat je de invoer begint in A2, maar ook dat kan je natuurlijk aanpassen. Met 30 namen of getallen worden de cellen A2:A31 gevuld.
2. Typ in B2: =aselect() en kopieer naar beneden in kolom B tot en met B31.
Dat geeft als resultaat een randomlijst met getallen met 6 decimalen. Die kolom (kolom B) kun je eventueel verbergen).
3. Typ in C2: =index($A$2:$A$31;rang(B2;$B$2:$B$31)) en kopieer naar beneden in kolom C tot en met C31 (Let goed op dat je de formule letterlijk overneemt (dus mét dollartekens), dat je die plaatst in C2, en daarna naar beneden kopieert).
4. Voilá, nu heb je in kolom C een willekeurig gesorteerde lijst waarin geen dubbele namen of nummers voorkomen. Telkens dat je op de functietoets F9 drukt, verschijnt er een nieuwe randomlijst. MAAR: dat gebeurt niet alleen als je op F9 drukt, dat is ook het geval als je een willekeurige andere bewerking doet in het werkblad (test dat even). Dat is natuurlijk niet handig, want je zult met een gemaakte randomlijst verder willen werken (bv. die kopiëren naar elders, zoals de vragensteller in dit topic wil).
5. Daarom moet je die lijst in kolom C kopiëren en plakken zonder formules, dan verandert hij niet meer. Dat kan als volgt:
- Selecteer C2:C31 en klik in het lint op "Kopiëren",
- Selecteer dan D2:D31 en kies in het menu: "Plakken - Plakken speciaal - Waarden". Druk daarna 1 keer op de Esc-toets en selecteer een willekeurige andere cel. (Merk op dat de lijst in kolom D anders gesorteerd is dan die in kolom C, maar dat is geen probleem).
6. Nu heb je in kolom D alle namen of nummers die door andere acties niet meer kunnen wijzigen. Vanuit kolom D kun je de gegevens naar elke willekeurige andere plaats kopiëren in hetzelfde- of in een ander werkblad (dat zie je gebeuren in de video waarnaar de vragensteller in zijn bericht van 29-04-2022, 20:06 uur verwees). Je ziet dat er geen andere toepassingen (zoals bv. Kutools) nodig zijn om te kunnen bereiken wat je wil.
7. Wil je een nieuwe randomlijst, dan druk je 1 keer op F9. In kolom C verschijnt dan die lijst die je weer moet kopiëren en plakken in kolom D, waarna je vandaar de gegevens kunt kopiëren naar andere plaatsen.
8. Alles wat hierboven staat kun je in een macro onderbrengen, dan gebeurt het automatisch. Je kunt daarvoor de macrorecorder gebruiken (dan hoef je geen vba te kennen, maar krijg je ook erg veel onnodige coderegels). Beter is uiteraard de vba-code zelf te schrijven, er kan dan - indien nodig - ook rekening gehouden worden met namen of nummers die je niet 'mee wil nemen' in de lijst . Om dat te doen, moet je wel vba kennen en dan vergt dat de nodige uren. Maar dan heb je wel met 1 klik en in 1 seconde de gewenste weergave, precies zoals je die wil. Overigens is het nog beter om de randomberekening in het geheugen uit te voeren en van daaruit de gegevens in de gewenste cellen te plaatsen. Maar dat levert geen ander resultaat op en de uitvoering zal geen halve seconde korter duren.
-
drumeke - Lid geworden op: 05 feb 2005, 18:24
- Locatie: Antwerpen
Bedankt iedereen over het mee denken
ik heb ondertussen met jullie toevoegingen en andere sites een oplossing kunnen samenstellen.
Ik sorteer 1kolom op random en deel die daarna op in 3 delen.
Zonder KU Tools dan te gebruiken maar wel met een Macro inVBA
de code is dan de volgende.
Sub Knop2_Klikken()
'Sub Button1_Click()
Dim tempString As String, tempInteger As Integer, i As Integer, j As Integer
For ii = 2 To 13
Cells(ii, 2).Value = WorksheetFunction.RandBetween(0, 100)
Next ii
For i = 2 To 60
For j = i + 1 To 60
If Cells(j, 2).Value < Cells(i, 2).Value Then
tempString = Cells(i, 1).Value
Cells(i, 1).Value = Cells(j, 1).Value
Cells(j, 1).Value = tempString
tempInteger = Cells(i, 2).Value
Cells(i, 2).Value = Cells(j, 2).Value
Cells(j, 2).Value = tempInteger
End If
Next j
Next i
End Sub
Zo komt dit wel in orde hoor.
Ik heb nog meer problemen die ik moet oplossen die stel ik later wel.
Ik ga dit nog verder uitwerken en zal indien gewenst later wel even een oplossing doormailen.
ik heb ondertussen met jullie toevoegingen en andere sites een oplossing kunnen samenstellen.
Ik sorteer 1kolom op random en deel die daarna op in 3 delen.
Zonder KU Tools dan te gebruiken maar wel met een Macro inVBA
de code is dan de volgende.
Sub Knop2_Klikken()
'Sub Button1_Click()
Dim tempString As String, tempInteger As Integer, i As Integer, j As Integer
For ii = 2 To 13
Cells(ii, 2).Value = WorksheetFunction.RandBetween(0, 100)
Next ii
For i = 2 To 60
For j = i + 1 To 60
If Cells(j, 2).Value < Cells(i, 2).Value Then
tempString = Cells(i, 1).Value
Cells(i, 1).Value = Cells(j, 1).Value
Cells(j, 1).Value = tempString
tempInteger = Cells(i, 2).Value
Cells(i, 2).Value = Cells(j, 2).Value
Cells(j, 2).Value = tempInteger
End If
Next j
Next i
End Sub
Zo komt dit wel in orde hoor.
Ik heb nog meer problemen die ik moet oplossen die stel ik later wel.
Ik ga dit nog verder uitwerken en zal indien gewenst later wel even een oplossing doormailen.
-
Danny. - Lid geworden op: 15 mei 2003, 21:42
- Locatie: Vlaams Brabant
Franck, niet dat ik dit nu zal gebruiken, maar enkel om de werking ervan te bekijken, heb ik een Excel blad geopend, en daar uitgevoerd wat jij daar hebt laten zien, en mag ik hier ook de raad geven aan iedereen dit ook te doen.
Ik sta versteld van wat er al met Excel kan bekomen worden, maar ook dat sommigen onder ons, die zich niet als expert uitgeven, tot dergelijke oplossingen kunnen komen, niet meer of niet minder een dikke proficiat.
Het is ook leuk te zien dat tijdens het schrijven van die formules direct de kolom die aangesproken werd in die formule, van kleur verandert.
En ik herhaal hier, ter attentie van Opam, dat er hier op Seniorennet ook mensen te vinden zijn die weg kunnen met Excel
Groetjes
Danny
Windows 11 Home 64-bit, Ram 8GB, Medion Akoya E23403 All-In-One, Microsoft Defender
-
franç - Lid geworden op: 10 jul 2003, 12:34
Het spijt me om het te zeggen, maar met die macro komt het zeker 'niet in orde'. Die plaatst enkel wat gegevens in een bepaalde volgorde, waarbij de kans zeer groot is dat er dubbele waarden in voorkomen en dat zal toch niet de bedoeling zijn. Bovendien zien we niets van plaatsing van nummers of namen in 3 x 3 kolommen.
Danny en Lode: dank voor jullie positieve feedback.
Ook anderen dank om te reageren.
Voor geïnteresseerden: Om te zien hoe je een lijst met namen (of nummers) 'at random' in 3 x 3 kolommen kunt presenteren, kun je onderstaande macro gebruiken. Het enige dat je moet doen is in Excel in kolom A van Blad1 een aantal namen (of nummers) invoeren, beginnend in A2, en daarna de macro uitvoeren (formules invoeren en kopiëren/plakken is niet nodig). Bij elke uitvoering worden in Blad1 drie randomlijsten van drie kolommen gegenereerd.
De macro moet je plaatsen in een module. Als je de macro meerdere keren uit wil voeren is het het handigst om in het blad een knop te plaatsen om de macro uit te voeren. Plaats die knop dan op een plaats die niet bij de berekening en indeling wordt betrokken, bv. in A1. Bekijk na uitvoering het afdrukvoorbeeld van Blad1, zodat je kunt zien hoe het resultaat na afdrukken er op papier uit zou komen te zien.
Code: Selecteer alles
Sub Indeling_maken()
Dim a As Integer, b As Integer, c As Integer, k As Integer
Dim x As Integer, y As Integer, lr As Integer
Dim myrnk As String, myind As String
Application.ScreenUpdating = False
With Worksheets("Blad1")
.Columns("b:w").ClearContents
a = 0: lr = .Cells(.Rows.Count, 1).End(xlUp).Row
For k = 5 To 15 Step 5
For x = 2 To lr
.Cells(x, 2).Value = Rnd()
Next x
For y = 2 To lr
myrnk = Application.Rank(.Cells(y, 2), .Range(.Cells(2, 2), .Cells(lr, 2)))
myind = Application.Index(.Range(.Cells(2, 1), .Cells(lr, 1)), myrnk)
.Cells(y, 3).Value = myind
Next y
a = a + 1: x = 1
With .Cells(x, k)
.Value = "R o n d e " & a
.Font.Bold = True
End With
b = 0: c = 0: x = 2: y = 2
Do Until IsEmpty(.Cells(y, 3))
c = c + 1
If WorksheetFunction.IsOdd(c) Then
b = b + 1: x = x + 1
.Cells(x, k).Value = "Veld " & b
End If
.Cells(x, k + 1).Value = .Cells(y, 3).Value
y = y + 1
.Cells(x, k + 2).Value = .Cells(y, 3).Value
y = y + 1
.Cells(x, k + 3).Value = .Cells(y, 3).Value
x = x + 1: y = y + 1
Loop
If IsEmpty(.Cells(x - 1, k + 2)) Then
.Cells(x - 2, k + 3).Cut .Cells(x - 1, k + 2)
End If
Next k
.Columns("b:c").Delete
With .PageSetup
.Orientation = xlLandscape
.PrintArea = "$c:$p"
End With
End With
Application.ScreenUpdating = True
End Sub-
bakerman - Lid geworden op: 29 apr 2022, 13:59
- Locatie: Merksem(Antwerpen)
Meestal heb je voor deze acties al wel een werkblad voorbereid zoals onderstaande.

Zoals je wel zal weten werkt elke lees- en schrijfactie van en naar het werkblad vertragend. Lees daarom je
getallenreeks in in een Array en sorteer deze at random in het werkgeheugen. Lees daarna elk element van deze Array uit om de reeksen in het werkblad te plaatsen.
Plaats de getallen in kolom A vanaf cel A5.


Zoals je wel zal weten werkt elke lees- en schrijfactie van en naar het werkblad vertragend. Lees daarom je
getallenreeks in in een Array en sorteer deze at random in het werkgeheugen. Lees daarna elk element van deze Array uit om de reeksen in het werkblad te plaatsen.
Plaats de getallen in kolom A vanaf cel A5.
Code: Selecteer alles
Sub Loting_Bis()
Range("E4:G24,J4:L24,O4:Q24").ClearContents
lastCol = 5
For num = 1 To 3
Dim sn
myarr = Range("A5", Range("A" & Rows.Count).End(xlUp))
ReDim sn(1 To UBound(myarr))
For i = 1 To UBound(myarr)
sn(i) = myarr(i, 1)
Next
For i = UBound(sn) To LBound(sn) Step -1
t = sn(i): j = rndB(LBound(sn), UBound(sn))
sn(i) = sn(j): sn(j) = t
Next
recCount = UBound(sn): colCount = 3
extraRecs = recCount Mod colCount
evenDiv = (recCount - extraRecs) / colCount
i = 1
Do While i < recCount
For j = 1 To evenDiv
Cells(j + 3, lastCol).Value = sn(i)
i = i + 1
Next j
If j = evenDiv + 1 And extraRecs > 0 Then
Cells(j + 3, lastCol).Value = sn(i)
i = i + 1
extraRecs = extraRecs - 1
End If
lastCol = lastCol + 1
Loop
lastCol = lastCol + 2
Next
End Sub
Function rndB(min, max)
rndB = Int((max - min) * Rnd()) + min
End Function
-
franç - Lid geworden op: 10 jul 2003, 12:34
Tja, zo maak je je er wel héél erg gemakkelijk vanaf. Hiervoor heb ik al geschreven dat niet zozeer het vinden van een oplossing tijd vergt (en dat heb ik ook aangetoond), maar dat juist de weergave in de gewenste vorm via vba dat is. Daar ga je volledig aan voorbij. Maar dag mag hoor, het is maar waar je voor kiest, nietwaar.
Een oplossing via het geheugen ken ik ook en ik koos daar hier bewust niet voor. Hiervoor schreef ik al
(citaat):"Overigens is het nog beter om de randomberekening in het geheugen uit te voeren en van daaruit de gegevens in de gewenste cellen te plaatsen. Maar dat levert geen ander resultaat op en de uitvoering zal geen halve seconde korter duren." (Einde citaat). En dat dat zo is, had ik ook op voorhand getest.
Het ware overigens beter geweest dat je je laatste bericht reeds in je eerste reactie had vermeld en niet via een pb aan de vragensteller. Een forum is immers niet voor twee personen, maar voor alle geïnteresseerden bestemd.
-
bakerman - Lid geworden op: 29 apr 2022, 13:59
- Locatie: Merksem(Antwerpen)
In het filmpje was te zien dat de vraagsteller zijn layout al klaar had en dat de vraag was om een reeks getallen
gesorteerd at random in deze context te plaatsen.
De reden voor dat PB was enkel en alleen omdat het hier blijkbaar niet mogelijk is om een Excel bestand in te voegen, anders had je deze oplossing al enkele dagen geleden gepresenteerd gekregen.
En zelfs met deze beperkte dataset is het al visueel merkbaar dat jouw methode trager is dan de mijne.
(ook getest).
De tijd die nodig is voor het vinden van een oplossing lijkt mij eerder gebonden aan de kennis van VBA en de complexiteit van het gevraagde.
gesorteerd at random in deze context te plaatsen.
De reden voor dat PB was enkel en alleen omdat het hier blijkbaar niet mogelijk is om een Excel bestand in te voegen, anders had je deze oplossing al enkele dagen geleden gepresenteerd gekregen.
En zelfs met deze beperkte dataset is het al visueel merkbaar dat jouw methode trager is dan de mijne.
(ook getest).
De tijd die nodig is voor het vinden van een oplossing lijkt mij eerder gebonden aan de kennis van VBA en de complexiteit van het gevraagde.
-
franç - Lid geworden op: 10 jul 2003, 12:34
Je had je oplossing toen ook kunnen presenteren zoals in je bericht hierboven.