unieke nummers genereren voor een excel-formulier

Status
Niet open voor verdere reacties.

Guess Who

Gebruiker
Lid geworden
7 nov 2006
Berichten
54
Ik probeer de getallen van 1 tot 6 in 6 tekstboxen te plaatsen, maar in willekeurige volgorde en dus ook uniek.
Het loopt echter al fout bij het 2de getal. :o
Weet iemand hoe ik dit beter kan oplossen?
Dit heb ik nu, het is een code die uitgevoerd wordt bij het aan en uitvinken van een checkbox.
Code:
    Plaats1.Value = Int(rnd * aantal) + 1
    Plaats2.Value = Int(rnd * aantal) + 1
   
    Dim voorwaarde1 As Integer
    voorwaarde1 = 0
    Do Until voorwaarde1 = 1
    If Plaats2.Value = Plaats1.Value Then
    voorwaarde1 = 0
    Plaats2.Value = Int(rnd * aantal) + 1
    Else
    voorwaarde1 = 1
    End If
    Loop

Indien dit lukt wil ik de voorwaarden nog wat scherper zetten door enkele bijkomende voorwaarden.
 
je kan het helemaal random maken maar dat kan op moment 1 erg kort duren op moment 2 super lang.

Om te beperken geeft ik een tussen oplossing houd ik in index bij.

Het enige wat er nog gedaan moet worden is plaatsx te koppelen aan een waarde( in onderstaande code is dit de range)

Code:
Public Function setNummerinTexboxen()

Dim lengte As Integer
Dim begin As Integer
Dim newValue As Integer

begin = 1
lengte = 6

Dim ControleArray(begin, lengte) As Integer

For positie = LBound(ControleArray) To UBound(ControleArray)
    bestaandeArray(pos) = positie
Next

newValue = Rnd(begin, lengte)

ControleArray = RemoveElementFromArray(ControleArray,newValue,Gettype(Int))

Range(0, 1) = newValue

For i = LBound(ControleArray) To UBound(ControleArray)
    
    newValue = Rnd(begin, lengte - i)
    ControleArray = RemoveElementFromArray(ControleArray,newValue,Gettype(Int))
    Range(0, i + 1) = newValue
       
    

Next

End Function


Public Function RemoveElementFromArray(ByVal objArray As System.Array, ByVal objElement As Object, ByVal objType As System.Type)

    Dim objArrayList As New ArrayList(objArray)
    objArrayList.Remove (objElement)
    Return objArrayList.ToArray(objType)
End Function
 
ouch, ziet er op het eerste zicht ingewikkeld uit.
Dit zal ik toch even goed moeten bekijken.

Toch al bedankt voor een eerste reactie.
 
1: Genereer een array met de waarde(1,6)
Hierdoor krijg je een index. (Voorbeeld waarde 3 is index 2 in de array)
Dit doe een loop op de bouwen van beginwaarde tot eindwaard. Let er op
arrayindex begint bij 0 en niet bij 1

2:loop door de aangemaakte array heen
(for loop / foreach in vba is for waarde LBound(arraynaam) to Ubound(arraynaam)
Tijdens de loop actie doe je volgende.
1.Geneeer een randon die tussen begin waarde en einde waar zit)
2. Plaats deze waarde in de texbox(plaatsx.value)
3. verwijder deze index uit array

De code lijkt ingewikkeld op dat je van vba geen elementen(index) uit een array kan halen vandaar de anders.
 
Dat maakt het een stukje duidelijker.
Als ik deze code echter gebruik, lijkt het of mijn vba in excel de public function "RemoveElementFromArray" niet doet.

en kan ik op deze manier ook 2 getallen, die uit een aparte zoekfunctie komen, ook uit de array halen?
 
Indien de waarden bekent en uniek zijn en beperkt in aantal is deze methode onnodig ingewikkeld.

Vul een array met waarde 1 t/m 6, wissel 50-100 keer element 1 om met element "random" en je krijgt een redelijke random verdeling van de elementen in de array. Voordeel is dat de samenstelling van je originele array uniek blijft. Met de removeelement truc kan het nog eenvoudiger door element "random" uit lijst 1 te halen en in lijst 2 te plaatsen.

Code:
Sub rnummer()

Dim nummers() As Variant
Randomize

nummers = Array(1, 2, 3, 4, 5, 6)
For i = 1 To 100
    temploc = Int((5 * Rnd) + 1)
    tempnum = nummers(temploc)
    nummers(temploc) = nummers(0)
    nummers(0) = tempnum
Next i
MsgBox (Join(nummers, " "))

End Sub
 
@Wampier:
Dit is nou net wat ik niet wil. Het is de bedoeling om bij het spelen van een spel telkens te wisselen van plaats. De eerste en de laatste plaats geven soms toch voor- en nadelen. De plaatsen worden ook telkens in een aparte lijst opgeslaan.
Er zijn dan ook nog eens verschillende combinaties van spelers (zijn we met 6, met 5 en wie doet er dan niet mee, ...)
Er moet dus eigenlijk eerst plaats 1 bepaald worden (speler 1 tot 6), maar een speler die het spel ervoor op plaats 1 zat (ongeacht de combinatie) EN de speler die de laatste keer op plaats 1 zat (bij deze combinatie) kunnen niet op plaats 1 zitten.
Dus er zal altijd 1 of meer spelers uit de array verwijderd worden.
Daarna wordt de laatste speler bepaalt met dezelfde voorwaarden: er moet dus eigenlijk eerst plaats 6 bepaald worden (speler 1 tot 6), maar een speler die het spel ervoor op plaats 6 zat (ongeacht de combinatie) EN de speler die de laatste keer op plaats 6 zat (bij deze combinatie) kunnen niet op plaats 6 zitten. En uiteraard kan ook de speler op plaats 1 niet op plaats 6 zitten.
Daarna worden de plaatsen 2 tot en ùmet 5 at random verdeeld.

Wat ik ook nog niet eerder vermelde: wij werken hier met excel 2003 in de nederlandstalige versie (ook voor vba).
 
Laatst bewerkt:
@Wampier:
Wat ik ook nog niet eerder vermelde: wij werken hier met excel 2003 in de nederlandstalige versie (ook voor vba).

Je eigen voorbeeld in je startpost is toch echt Engelse VBA? Ik begrijp niet helemaal wat je hier bedoeld.

Bovendien slaat mijn commentaar op de methode om te husselen. Dat de array een aantal leden korter wordt veranderd niets aan de methode. De methode werkt even goed met 4 leden als met 6.

uit je startpost:
Ik probeer de getallen van 1 tot 6 in 6 tekstboxen te plaatsen, maar in willekeurige volgorde en dus ook uniek.

en dat is exact wat mijn code doet (ipv te joinen in een tekstbox kan de array uiteraard worden toegewezen aan 6 textboxen). Dat je vervolgens allemaal nieuwe voorwaarden aan het probleem stelt had mijn kristallen bol niet voorzien.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan