Delphi Code in VBA übertragen - Lotto

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von roddy.

    Delphi Code in VBA übertragen - Lotto

    Hallo Forum,

    nach langer Zeit beschäftige ich mich mal wieder mit VBA und wollte ein kleines Lottoprogramm,
    welches eine Lottozahl erstellt und diese dann per Timer so lang wieder erstellt bis die erste Zahl erreicht wurde;
    das kann einige Millionen Versuche dauern - VBA hat ja keinen Timer, deswegen wollte ich erstmal eine Reihe ziehen.

    mein Delphi Code:

    Visual Basic-Quellcode

    1. var
    2. Form1 :TForm1;
    3. num :array[1..49] of byte;
    4. zahlen :array[1..6] of byte;
    5. ziehung :array[1..6] of byte;
    6. range :byte = 49;
    7. tries :integer;
    8. implementation
    9. {$R *.dfm}
    10. procedure TForm1.FormCreate(Sender: TObject);
    11. var i,z:byte;
    12. begin
    13. tries := 0;
    14. randomize();
    15. for i := 1 to 49 do num[i] := i;
    16. for i := 1 to 6 do
    17. begin
    18. z := random(range) + 1;
    19. while num[z] = 0 do z := random(range) + 1;
    20. num[z] := 0;
    21. ziehung[i] := z;
    22. end;
    23. edit1.text := '';
    24. for i := 1 to 6 do edit1.text := edit1.text + inttostr(ziehung[i]) + ', ';
    25. end;


    mein VBA Code bisher:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim intNum(49) As Integer
    3. Dim intZahlen(6) As Integer
    4. Dim intZiehung(6) As Integer
    5. Dim bytRange As Byte
    6. Private Sub btnZiehung_Click()
    7. Dim i, i2, i3, z As Byte
    8. Randomize
    9. For i = 1 To 49
    10. intNum(i) = i
    11. Next i
    12. For i2 = 1 To 6
    13. z = Rnd(49) + 1
    14. While intNum(z) = 0
    15. z = Rnd(49) + 1
    16. intNum(z) = 0
    17. intZiehung(i) = z
    18. Wend
    19. Next i2
    20. edit1.Text = ""
    21. For i3 = 1 To 6
    22. edit1.Text = edit1.Text + Str(intZiehung(i3)) + ", "
    23. 'raus kommt hier nur 0, 0, 0, 0, 0, 0
    24. Next i3


    Erstmal stand ich vor dem Problem, das eine Variable nicht öfters in Schleifen verwendet werden kann.
    Das hab ich so gelöst in dem ich einfach mehrere Schleifenvariablen nutze.
    Weiterhin bin ich mir nicht sicher, ob die Bedingung: While intNum(z) = 0 richtig ist, das ein "=" in VBA doch eine Zuweisung ist?

    Wenn ihr mir helfen könnt wäre ich euch sehr dankbar.
    Ob ein Push nach 9 Stunden schon OK ist, weiß ich nicht.

    Nichtsdestotrotz hier einige Bemerkungen zu deinem Code:

    1) Du hast Recht. Man kann eine Laufvariable nicht innerhalb einer Schleife mit derselben Laufvariable nochmal verwenden. Dies geht also nicht:

    Visual Basic-Quellcode

    1. For i = 1 To 49
    2. For i = 1 To 6
    3. ...
    4. Next i
    5. Next i

    Aber außerhalb der Schleife kann man sie wieder verwenden, wenn man den Wert der Variablen nicht weiter benötigt. Dies geht also:

    Visual Basic-Quellcode

    1. For i = 1 To 49
    2. ...
    3. Next i
    4. For i = 1 To 6
    5. ...
    6. Next i


    Und so wie ich das sehe, ist bei dir zweiteres der Fall.


    2) Rnd(49) hat als Ergebnis einen Wert zwischen 0 und 1. Um eine Zahl zwischen 1 und 49 zu bekommen, musst du statt "Rnd(49) + 1" dies schreiben: "Int(49 * Rnd + 1)". (Int, damit die Nachkommastellen abgeschnitten werden) Für näheres über das Argument der Rnd-Funktion lese dir bitte den entsprechenden Abschnitt in der VB-Hilfe durch.


    3) Ich vermute, dass du in der While-Schleife nur die Zeile mit "z = ..." wiederholen lassen willst. Hierzu ein Tipp: Im vorliegenden Fall würde ich dir eine fußgesteuerte Schleife empfehlen. Dadurch kannst du dir das "z = ..." vor der Schleife sparen:

    Visual Basic-Quellcode

    1. Do
    2. z = Int(49 * Rnd + 1)
    3. Loop While intNum(z) = 0
    4. intNum(z) = 0
    5. intZiehung(i2) = z


    4) Du hast bei "intZiehung(i) = z" i verwendet, obwohl deine Laufvariable in dieser Schleife i2 ist.

    5) Noch ein Tipp: Wenn du willst, kannst du auch die untere Grenze bei der Deklaration eines Arrays angeben:

    Visual Basic-Quellcode

    1. Dim intNum(1 To 49) As Integer