For Next If Then Else

Status
Niet open voor verdere reacties.

D-Mon

Gebruiker
Lid geworden
5 apr 2002
Berichten
65
Beste helpmijers,

Ik wil een random getal tussen 1 en 10 laten genereren en deze vervolgens naar excel wegschrijven.
Het random moet vervolgens geplaatst gaan worden op een eerstvolgende vrije locatie, namelijk in chronologische volgorde: B4, D4, B5, D5, B6, D6 t/m D13. Ik wil dit doen middels de volgende code, maar krijg de melding "Next zonder For".

Dim i As Integer
i = Int((10 - 1 + 1) * Rnd) + 1

For j = 4 To 13
If Sheets(1).Range("B" & j).Value = "" Then
Sheets(1).Range("D" & j).Value = i
Else:
If Sheets(1).Range("D" & j).Value = "" Then
Sheets(1).Range("B" & j).Value = i
Else:
Next

Wat doe ik fout?
 
Dim i As Integer
i = Int((10 - 1 + 1) * Rnd) + 1

For j = 4 To 13
If Sheets(1).Range("B" & j).Value = "" Then
Sheets(1).Range("D" & j).Value = i
Else:
If Sheets(1).Range("D" & j).Value = "" Then
Sheets(1).Range("B" & j).Value = i
Else:
Next

Wat doe ik fout?

je sluit je if's niet goed af
en de if structuur snap ik niet helemaal aangezien je aangeeft dat er op de eerstvolgende vrije plaats wat gezet moet worden.
Maar je controleert of Bj leeg is en plaatst dan de waarde i op Dj en als Dj leeg is plaats je wat op Bj.
Dus als B4 gevuld is en D4 niet gaat de eerste if niet op (B4 is namelijk niet "") en de tweede if wel en overschrijf je daarmee de waarde in B4
(als je alle ifs goed zou sluiten)

Code:
Dim i As Integer
i = Int((10 - 1 + 1) * Rnd) + 1

For j = 4 To 13
        If Sheets(1).Range("B" & j).Value = "" Then Sheets(1).Range("B" & j).Value = i
        If Sheets(1).Range("D" & j).Value = "" Then Sheets(1).Range("D" & j).Value = i
Next

Zou mijns insziens beter functioneren maar het vullen van cellen is niet mijn specialiteit dus ik vermoed dat een echte Excel goeroe het nog wel in de helft van mijn code kan
 
Laatst bewerkt:
Ik zou het zo doen, anders krijg je telkenmale hetzelfde getal
Code:
For j = 4 To 13
        If Sheets(1).Range("B" & j).Value = "" Then Sheets(1).Range("B" & j).Value = Int((10 - 1 + 1) * Rnd) + 1
        If Sheets(1).Range("D" & j).Value = "" Then Sheets(1).Range("D" & j).Value = Int((10 - 1 + 1) * Rnd) + 1
Next
 
Code:
With sheets(1)
  For j = 4 To 13
    .cells(j,2+iif(.cells(j,2)="",0,2))= Int(10 * Rnd) + 1
  Next
End with
of
Code:
Sub tst()
    With Sheets(1)
      For j = 8 To 27
        .Cells(j \ 2, 2 + 2 * Abs(.Cells(j \ 2, 2) <> "")) = Int(10 * Rnd) + 1
      Next
    End With
End Sub
 
Laatst bewerkt:
@snb
Hoe kom je er in hemelsnaam toch op ?:confused::confused:
 
Bedankt voor jullie reacties! Ik heb echter onvolledige informatie doorgegeven merk ik nu... mijn opzet is alsvolgt:

Sub random()

Dim i As Integer

i = Int((10 - 1 + 1) * Rnd) + 1

If Sheets(1).Range("H" & i + 3).Value = Sheets(1).Range(K3).Value Then

For j = 4 To 13
If Sheets(1).Range("D" & j).Value = "" Then
Sheets(1).Range("D" & j).Value = i
Else:
If Sheets(1).Range("B" & j).Value = "" Then
Sheets(1).Range("B" & j).Value = i
Else:
Next

Call random

End Sub


De waarde i dient namelijk aan een voorwaarde te voldoen. Indien hij dat niet doet, dan dient er opnieuw een i uitgerekend te worden, net zolang tot hij dat wel doet.
Zodra die waarde gevonden is, moet er een lege cel gezocht worden.
Misschien dat de situatie nu wat duidelijker is.

Ik hoop dat jullie me verder kunnen helpen!

Arno
 
Code:
Dim i As Integer

Do
i = Int((10 - 1 + 1) * Rnd) + 1
While Sheets(1).Range("H" & i + 3).Value <> Sheets(1).Range(K3).Value

With sheets(1)
  For j = 4 To 13
    .cells(j,2+iif(.cells(j,2)="",0,2))=i
  Next
End with


Maar SNB heeft geheid een mooiere oplossing :)
 
Wat is de zin van een random getal als tevoren vaststaat aan welke voorwaarde die moet voldoen ? Hoezo contradictio in terminis ?

@Rudi
via de snb-academie
Zoals deze:

Code:
Sub korter()
  Range("B4:D13").SpecialCells(4).Cells(1)=Int(10 * Rnd) + 1
End Sub
 
Laatst bewerkt:
Meer achtergrondinformatie:

Het betreft het genereren van een wedstrijdschema, en om het geheel zo eerlijk mogelijk te houden wil ik de spelersID's random laten genereren.

Maarrr... De voorwaarde is dat ik niet wil dat persoon A 5 wedstrijden achter elkaar speelt, en persoon B 2 aan het begin en 3 aan het eind van het toernooi.

Het minimum aantal ingeplande wedstrijden per speler van alle spelers zet ik in K3. Voorwaarde is dus dat het aantal ingeplande wedstrijden daaraan gelijk moet zijn, dit om te behouden dat elke speler (ongeveer) dezelfde pauze tussen zijn wedstrijden houdt.

Ik hoop dat dit meer duidelijkheid geeft.

Arno
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan