Zahlen sortiert ausgeben
#1
Hallo,

zunächst mal Dank an diejenigen, die mir bisher schon geholfen haben. Das ging fix und zeigt mir, daß hier wirklich Leute am Werk sind, die Ahnung von der Materie haben. 
Ich selbst bin blutiger Anfänger und schuster mir alles mühsam zusammen.

Dank Eurer Hilfe habe ich folgendes Script hinbekommen:

Code:
Sub Zufallszahl()
Dim rng As Range
    Dim randomCell As Range
    Dim randomNumber As Integer
 
    ' Bereich angeben
    Set rng = Range("F70:F74")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng.Cells(Int(rng.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 1 in Zelle I70 schreiben
    Range("I70").Value = randomNumber
   
      ' Bereich angeben
    Set rng2 = Range("F75:F81")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng2.Cells(Int(rng2.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 2 in Zelle I71 schreiben
    Range("I71").Value = randomNumber
   
        ' Bereich angeben
    Set rng3 = Range("F82:F89")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng3.Cells(Int(rng3.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 3 in Zelle I72 schreiben
    Range("I72").Value = randomNumber
   
        ' Bereich angeben
    Set rng4 = Range("F70:F84")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng4.Cells(Int(rng4.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 4 in Zelle I73 schreiben
    Range("I73").Value = randomNumber
   
        ' Bereich angeben
    Set rng5 = Range("F89:F99")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng5.Cells(Int(rng5.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 5 in Zelle I74 schreiben
    Range("I74").Value = randomNumber
   
        ' Bereich angeben
    Set rng6 = Range("F87:F97")
 
    ' Zufällige Zelle aus dem Bereich auswählen
    Set randomCell = rng6.Cells(Int(rng6.Cells.Count * Rnd + 1))
 
    ' Wert der zufälligen Zelle erhalten
    randomNumber = randomCell.Value
 
    ' Zufällige Zahl 6 in Zelle I75 schreiben
    Range("I75").Value = randomNumber
   
           
   
End Sub


  Damit werden 6 Zufallszahlen aus vorher definierten Bereichen generiert, die in die Zellen I70 bis I75 geschrieben werden. Dabei können aber Zahlen doppelt vorkommen, was nicht erwünscht ist.

  Im Tabellenblatt kann ich in der Spalte daneben ,also von J70 bis J75 jeweils den Rang ermitteln und dann mit der Formel SUMME(J70:J75) in Zeile J76 feststellen, ob eine oder mehreren Zahlen doppelt vorkommen.
 Ist die Summe 21, kommt keine Zahl doppelt vor.
 
 Wie bewerkstellige ich nun im Makro, daß wenn ich auf den Button klicke, im Falle, daß die Summe ungleich 21 ist, weiter gerechnet wird, bis die Summe 21 ist ? Das müßte wohl mit der Funktion Loop gehen, oder?

 Bin aber Anfänger und hab nur unzureichende Kenntnisse wie man die Loop-Funktion in das Makro integriert. 

 Und dann ist da noch ein Problem: Wenn geklärt ist, daß es wirklich sechs unterschiedliche Zahlen sind, also die Summe der Rangwerte 21 beträgt, müßten die sechs Zahlen aufsteigend sortiert werden und dann

 in die Zellen "Berechnungen!E30" bis "Berechnungen!J30" geschrieben werden.

 Wäre echt super, wenn das einer hinkriegt.

 Dank im vorhinein für Eure Mühe.
Antworten Top
#2
Moin!
Kommt mir wie eine Gruppenarbeit vor, denn auf Herber gibt es eine ähnliche Anfrage (von Dir?).
https://www.herber.de/forum/archiv/1932t...ahlen.html

Du solltest mal die konkrete Aufgabe vorstellen, gerne auch iVm einer Datei.
Durchaus denkbar, dass man ganz anders an die Sache herangehen kann.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#3
Hi

so wäre mein Ansatz.
Code:
Public Sub Start()
Dim j As Long, Bereich, objZuf As Object, k As Long

Set objZuf = CreateObject("System.Collections.Arraylist")

For j = 1 To 6
  Bereich = Split(Choose(j, "70 74", "75 81", "82 89", "70 84", "89 99", "87 97"))
    Do
      k = Application.Index(Range("F:F"), WorksheetFunction.RandBetween(Bereich(0), Bereich(1)))
      If Not objZuf.Contains(k) Then objZuf.Add (k)
    Loop While j > objZuf.Count
Next j

objZuf.Sort
Range("D70:D75") = Application.Transpose(objZuf.toarray)

Set objZuf = Nothing
End Sub
Gruß Elex
Antworten Top
#4
Hallo,

hier ein Beispiel.
Prüfen ob doppelte Werte vorhanden sind und sortierung wird direkt im Code gemacht.

LG
Norbert


Code:
Sub zufallszahlen_generieren()

' Bereich angeben
ReDim Rng(6) As Range
Set Rng(1) = Range("F70:F74")
Set Rng(2) = Range("F75:F81")
Set Rng(3) = Range("F82:F89")
Set Rng(4) = Range("F70:F84")
Set Rng(5) = Range("F89:F99")
Set Rng(6) = Range("F87:F97")
   
anz_werte = 6


ReDim zufallszahl(anz_werte)

'Zufallszahlen generieren
For i = 1 To anz_werte
    wert_ok = False
    savecount = 1
    While Not wert_ok And savecount < 1000
        zufallszahl(i) = Rng(i).Cells(Int(Rng(i).Cells.Count * Rnd + 1))
        wert_ok = True
        For i1 = 1 To i - 1 'Auf doppelte werte prüfen
            If zufallszahl(i) = zufallszahl(i1) Then
                wert_ok = False
                Exit For
            End If
        Next i1
        savecount = savecount + 1
    Wend
Next i


'Sortieren
For i = 1 To anz_werte - 1
    For i1 = i + 1 To anz_werte
        If zufallszahl(i) > zufallszahl(i1) Then
            merk = zufallszahl(i)
            zufallszahl(i) = zufallszahl(i1)
            zufallszahl(i1) = merk
        End If
    Next
Next

'Ausgabe
For i = 1 To anz_werte
    Cells(70, i + 9) = zufallszahl(i)
Next

End Sub
Antworten Top
#5
Hallo Ralf,

was soll ich denn bitte schön noch konkreter äußern? Lies Dir doch nochmal den Text durch. Das ist doch klar verständlich, oder etwa nicht? Wenn Du weißt, wie man die Loop-Schleife in das Script einbindet, warum schreibst Du mir die paar Zeilen nicht?

Für jemand, der jahrelange Erfahrung damit hat, müßte das doch wohl ein Klacks sein.

Hallo Elex,

erstmal Danke für Deine Mühe.

Leider ist es nicht das, was ich mir erhofft habe. Als Anfänger bin ich maßlos überfordert, wenn ich ein neues Script sehe mit massenhaft Befehlen, die ich nicht kenne.

Ich habe ein Script, das bis jetzt funktioniert. Ich will an diesem Code auch nichts ändern. Es soll also nicht alles grundlegend anders gemacht werden, sondern das Script soll ergänzt werden,
um so Schritt für Schritt zum gewünschten Ergebnis zu kommen.

Es muß doch möglich sein, nachdem die sechs Zahlen ermittelt wurden, mit einem Befehl zu überprüfen, ob es tatsächlich sechs verschiedene Zahlen sind, oder ob eine Zahl doppelt vorkommt.

Und wenn dies der Fall ist, muß weitergerechnet werden, bis es sechs Zahlen sind. Und genau darum geht es mir. Wie kann ich das Script mit einer Loop-Funktion verknüpfen?
Antworten Top
#6
(31.05.2023, 23:10)zabulon schrieb: was soll ich denn bitte schön noch konkreter äußern? Lies Dir doch nochmal den Text durch. Das ist doch klar verständlich, oder etwa nicht? Wenn Du weißt, wie man die Loop-Schleife in das Script einbindet, warum schreibst Du mir die paar Zeilen nicht?

Für jemand, der jahrelange Erfahrung damit hat, müßte das doch wohl ein Klacks sein.

Danke für den wertvollen Tipp, aber ich bin des Lesens durchaus mächtig!
Wenn Du Deine "sechs" Bereiche mal genauer betrachtest, hast Du exakt - einen - Bereich, nämlich von F70:F99
Deshalb darfst Du mir durchaus abnehmen, dass meine Nachfrage Sinn macht!
Jedenfalls mehr Sinn, als hier stumpf einen Code-Monkey abzugeben …
Eine Unique-List erstellt man mit Deiner Uralt-Version am besten mit einem Scripting-Dictionary.
Ich würde es aber eher mit dem erweiterten Filter lösen.

Beschaffe Dir eine aktuelle Excel-Version (gerne auch das kostenlose Excel-Online).
Dann brauchst Du nur eine einzige Formelzelle:
FG
70172
71163
72119
73115
74119
75320
7610
7720
7817
7912
8014
819
827
8317
848
859
8618
8711
888
8916
902
9111
9216
9320
944
951
962
978
9815
9919

ZelleFormel
G70=LET(x;EINDEUTIG(F70:F99);
s;SORTIERENNACH
(x;ZUFALLSMATRIX(ANZAHL2(x)));
SORTIEREN
(INDEX(s;SEQUENZ(6))))
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#7
Moin

Varianten zum Prüfen ob die Zahl schon vorhanden ist findest du in den Links zum anderen Forum wo die gleiche Aufgabe angefragt wurde.
 
Falls du dazu lernen möchtest.
 
Eine Arraylist stellst du Dir am besten als weises A4 Blatt vor. Dem gibt man einen Namen z.B: (objZuf).
Set objZuf = CreateObject("System.Collections.Arraylist")
 
Auf das Blatt kann man schreiben. Das macht .Add(das soll drauf)
objZuf.Add (k)
 
Vorher kann man prüfen lassen ob der Wert schon drauf steht. Das macht .Contains
objZuf.Contains(k)
 
Und man kann zählen wie viel schon drauf steht.
objZuf.Count

objZuf .Sort ist dann einfach nach Größe sortieren.
 
„Split“ und „Choose“ und „Do Loop While“ lassen sich leicht selbst in der Hilfe nachlesen. For Next ist deine Schleife.

Gruß Elex
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste