03. maj 2006 - 12:54Der er
29 kommentarer og 3 løsninger
avanceret Random funktion
Jeg har 5 navne skrevet ind i en textbox i en userform. Disse 5 navne har hver en værdi fra 1-10, som er valgt ud fra en combobox ud fra hver navn. Jeg skal nu have en randomfunktion, som vælger et tilfældigt navn, men som samtidig tager højde for tallet som er tildelt det enkelte navn. Altså hvis navnet har fået et 10-tal, skal der være større chance for at det bliver valgt, end et navn som kun har fået 5. Kan det lade sig gøre?
Plads nr / Navn 1: Per 2: Per 3: Søren 4: Lisa 5: Lisa 6: Lisa 7: Lisa 8: Lisa 9: Lisa 10: Lisa 11: Lisa 12: Lisa 13: Lisa 14: Ole 15: Ole 16: Ole 17: Ole 18: Ole 19: Kaj 20: Kaj
Her efter tager du et tal mellem 1 og 20:
randomize x = Int(20*Rnd + 1)
Og vælger det tilfældige navn TilfaeldigtNavn = arrNavne(x)
NB: I ovenstående starter arrayet ved 1, og ikke ved nul. Det bestemmer du jo selv om du synes er en god ide. Du skal kunen finde ud af at bruge dynamiske arrays, fordi størrelsen hele tiden skifter, hver gang du tildeler nye points. Kan du finde ud af det?
Nej...kender det OVERHOVEDET ik...ved ik hvordan jeg laver det, så hvis jeg kunne lokke dig til at lave en kode der gør det, ville alt bare være super :)
Forresten...lige en lille ekstra, nu du er så super til VBA. Hvorfor får jeg en runtime error når jeg skriver koden: userform1.combobox1.additem "1", "1" ??
OK: Der er arrays (tabeller) og kontraoarrays i VB. Arrays kan være dynamiske (variabel størrelse) eller statiske (fast størrelse, mest almindeligt)
----------"ALMINDELIGE ARRAYS"-------------
Et array er bare en samling værdier i en tabel - f.eks. 10 stykekr tekst, 20 tal, eller noget andet.
Det laves sådan her:
Dim MitArray(3) as String '3tallet betyder at der er 3 pladser i tabellen Mitarray(0) = "Hej" Mitarray(1) = "med" Mitarray(2) = "dig"
Hvis du så herefter skriver MitArray(2) har det værdiern "med"
Hvis du skriver MitArray(0) = "Farvel" skifter du "Hej" ud med Farvel
----------"DYNAMSIKE ARRAYS"------------- Ligesom statiske, men man angiver ikke størrelsen. Derfor kan man skifte størrelse undervejs.
----------"KOntrol ARRAYS"-------------
Det er arrays med kontroller (f.eks. textboxe, comboboxe). Det betyder bare, at flere kontroller af samme slags hedder det samme, men hver har et index. De laves ved at man smider en kontrol (fx. en textbox) på sin form, markerer den, trykker Ctrl+C, herefter Ctrl+V, og siger JA til at oprette et kontrolarray. Skal der være 5 textboxe i et kontrolarray gør du det 5 gange.
DIN OPGAVE:
Læs og forsøg at forstå ovenstående. Herefter opretter du en helt ny form. Læg en textbox (Text1) og en combobox (Combo1) på din nye form. Og en knap (Command1)
Nu markerer du textboxen, kopierer den (Ctrl+C), indsætter en ny (Ctrl+V), og siger JA til at oprette et kontrolarray. Den nye textbox lægger du under den første. Gør det indtil du har 5 textboxe og 5 comboboxe.
Herefter copy-paster du koden i næste kommentar, og dit program virker 100%
Private Sub Form_Load() Dim i As Byte 'Bare en variabel til at tælle med Dim j As Byte 'Bare en variabel til at tælle med
'Når dit program startes fyldes værdierne 1..10 i comboboxene For j = 0 To 4 Combo1(j).Clear For i = 1 To 10 Combo1(j).AddItem i Next i Combo1(j).ListIndex = j * 2 + 1 'forhåndsvælger værdierne 2,4,6,8,10 i combo'erne Next j
'Når dit program startes fyldes der nogle standardnavne i textboxene Text1(0).Text = "Per" Text1(1).Text = "Lisa" Text1(2).Text = "Lotte" Text1(3).Text = "Susanne" Text1(4).Text = "Søren" End Sub
Private Sub Command1_Click() 'Finder antal points Dim i As Byte 'Bare en variabel til at tælle med Dim j As Byte 'Bare en variabel til at tælle med Dim k As Byte 'Bare en variabel til at tælle med Dim Pointsum As Byte 'Indeholder antal points i alt Dim arrNavne() As String Dim strDummy As String 'En midlertidig variabel
For i = 0 To 4 Pointsum = Pointsum + Val(Combo1(i).List(Combo1(i).ListIndex)) Next i
ReDim arrNavne(Pointsum) For i = 0 To 4 'looper igennem alle textboxene For j = 1 To Val(Combo1(i).List(Combo1(i).ListIndex)) 'looper fra 1 - antal points navnet arrNavne(k) = Text1(i).Text k = k + 1 Next j Next i
'Skriver hele arrayet ud i en msxbox for at kontrollere - det kan du bare slette i dit endelige program
'START KONTROL For i = 0 To Pointsum - 1 strDummy = strDummy & arrNavne(i) & " - " Next i strDummy = strDummy & "IKKE FLERE NAVNE, ialt: " & Pointsum MsgBox strDummy 'SLUT KONTROL
'Finder et tilfældigt tal j mellem 1 og Pointsum Randomize j = Int(Pointsum * Rnd)
'Finder et tilfældigt navn, efter "vægtet sandsynlighed"
MsgBox "Følgende navn er udtrukket: " & arrNavne(j), vbOKOnly + vbCritical
Hvor fremgår det? - du er trods alt i en Visual Basic kategori...
Nå - løsningen er densammen, men alle loope over kontroller må du skifte ud og skrive de enkelte kontrollers navne. Det kommer til at fylde noget mere, men ændrer ikke ved løsningens princip
PS: En anden gang, start lige med at skriv hvilken software du bruger, hvis du ikek bruger det kategorien handler om, ikke?
Jeg har brugt din kode til at indsætte tallene i ComboBoxene, men har ændre den til dette
With UserForm1 .ComboBox1.Clear .ComboBox2.Clear .ComboBox3.Clear .ComboBox4.Clear .ComboBox5.Clear For i = 1 To 10 .ComboBox1.AddItem i .ComboBox2.AddItem i .ComboBox3.AddItem i .ComboBox4.AddItem i .ComboBox5.AddItem i Next i .ComboBox1.ListIndex = j * 2 + 1 'forhåndsvælger værdierne 2,4,6,8,10 i combo'erne .ComboBox2.ListIndex = j * 2 + 1 .ComboBox3.ListIndex = j * 2 + 1 .ComboBox4.ListIndex = j * 2 + 1 .ComboBox5.ListIndex = j * 2 + 1 End With
jamen den gav bare ingen værdier i mine comboboxe. Men det var bare fordi jeg havde sat koden ind på en forkert knap. Jeg har fået det til at virke nu. og det med at jeg brugte j, så jeg så også lige da jeg havde sat det ind.
ok Du behøver jo ikke gøre som jeg gør - det var bare et forslag. Ideen er bare at fylde navne i et array, jo højere antal points jo flere gange er navnet i arrayet, og jo mere sandsynligt er det at det bliver udtrukket. Har du en mail, så kan du for sjovt få VB6-programmet
Jeg kan ikke helt se hvordan du vil lave den her kode om til noget jeg kan bruge? mine textboxe hedder TextBox1-5
ReDim arrNavne(Pointsum) For i = 0 To 4 'looper igennem alle textboxene For j = 1 To Val(Combo1(i).List(Combo1(i).ListIndex)) 'looper fra 1 - antal points navnet arrNavne(k) = Text1(i).Text k = k + 1 Next j Next i
>Hej martin moth - Ved control1(j).clear får jeg denne fejlmeddelelse når jeg prøver at køre dit program: wrong numer of arguments or invalid property assignment? Jeg har kopieret koden over for at se, hvordan den fungerer. Kan jeg så have gjort noget forkert. Jeg har VB6.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.