Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zufallszahlen im Zellbereich, ohne doppelte

Zufallszahlen im Zellbereich, ohne doppelte
11.02.2017 15:53:32
Dieter(Drummer)
Hallo Spezialisten,
mit diesem Makro sollen im markierten Zellbereich 20 ganzahlige Zufallsszahlen, ohne doppelte (fehlt auch noch) erzeugt werden. Ich bekomme einen Fehlerhinweis:
"Zelle = Variable nicht definiert!"
Jetziger Code:
  • 
    Sub ZufallszahlenAnlegen()
    Dim zelle As Range
    For Each zelle In Selection
     Zelle.Value = Rnd * 20 'Fehlerhinweis: Zelle = Variable nicht definiert!
    Next zelle
    End Sub
    

  • Wie müsste die DIM Anweisung lauten und wie ist der richtige Code, damit auch keine doppelten Ganzahlen entstehen?
    Gruß und vorab Danke für Hilfe.
    Dieter(Drummer)
    Anzeige

    16
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: noch so ein super-Code von snb
    11.02.2017 16:40:12
    snb
    Hallo,
    von snb:
    
    Sub iRnd()
    'eindeutige zufällig verteilte ganze Zahlen 1-n
    [a1:a20] = "=rand()"
    [a1:a20] = [index(rank(a1:a20,a1:a20),)]
    End Sub
    
    mfg
    AW: Danke Fennek ...
    11.02.2017 16:52:12
    Dieter(Drummer)
    ... Code von snb funktioniert.
    Klärt wohl nicht meine Fragen, aber ich komme damit klar.
    Gruß und Danke, Dieter(Drummer)
    Anzeige
    AW: Wie muss der Code lauten, wenn in 13 Zellen ..
    11.02.2017 17:07:19
    Dieter(Drummer)
    Hallo Fennek,
    ... wie muss der Code lauten (von snb), wenn in 13 Zellen eine nicht doppelte Zufallszahl von 1 - 20 eingetragen werden soll?
    Mit der Bitte um Hilfe.
    Gruß, Dieter(Drummer)
    so?
    12.02.2017 16:48:10
    Michael
    Hi,
    Sub iRnd()
    'eindeutige zufällig verteilte ganze Zahlen 1-n
    [a1:a20] = "=rand()"
    '[a1:a20] = [index(rank(a1:a20,a1:a20),)]
    [b1:b13] = [index(rank(a1:a20,a1:a20),)]
    End Sub
    
    Wenn ich das richtig sehe, wirft der Code aus dem Link (von Robert) ja auch Doppelte aus...
    Gruß,
    Michael
    Anzeige
    AW: Wen es auch interessiert, habe Lösung ...
    11.02.2017 17:27:35
    Dieter(Drummer)
    Hallo Fennek,
    ... im Internet gefunden, die gut funktioniert:
    Aus: "http://www.ecotronics.ch/vba/codebeispiele.asp?code_id=1174420299&fldsprache=VBA+Excel&fldTitle=In+ausgew%E4hlten+Zellen+Zufallszahlen+aus+einem+bestimmten+Bereich+erzeugen"
    Code:
    Sub ZufallszahlenInSelection()
    Dim untergrenze As Double
    Dim obergrenze As Double
    Dim anzStellen As Integer
    If MsgBox("Möchten Sie im markierten Bereich Zufallszahlen erstellen?", vbYesNo) = vbYes Then
    untergrenze = InputBox("Untergrenze?")
    obergrenze = InputBox("Obergrenze?")
    anzStellen = InputBox("Anzahl Stellen für Rundung")
    Call ZufallszahlenGenerieren(Selection, untergrenze, obergrenze, anzStellen)
    End If
    End Sub
    

    Danke für die Hilfe und einen schönen Abend.
    Gruß, Dieter(Drummer)
    Anzeige
    ...habe keine ! Lösung ...Function fehlt.....oW
    11.02.2017 17:36:23
    robert
    Eher 'ne weitere SubProz, ...
    11.02.2017 18:51:53
    Luc:-?
    …robert (& Dieter),
    nämlich ZufallszahlenGenerieren. Aber die wäre ggf auch wenig interessant, falls darin nicht auch jede Zahl (sicher!) einfach (nicht mehrfach!) erzeugt würde.
    Ansonsten gibt's dafür garantiert auch eine FmlLösung auf excelformeln.de! WF hatte hier mal eine solche Lösung gepostet…
    Im Prinzip muss ja nur ein durchgehender RANG für die generierten Zufallszahlen bestimmt wdn, falls die ganz­zahlig sein sollen. Ein solcher kann über eine Hilfsspalte mit Anfügen der ZeilenNr als Dezimalen ohne Wieder­holung fest­gelegt wdn (oder man nutzt meine UDF VRank - im Archiv - mit entsprd Argumen­tierung dafür, ggf auch ohne Hilfszellen, weil sie nicht auf Zell­Bereiche - wie die RANG-Fktt - angewiesen ist).
    Gruß, Luc :-?
    Besser informiert mit …
    Anzeige
    AW: Danke Luc :-? für Info. Gruß und owT.
    11.02.2017 19:55:38
    Dieter(Drummer)
    AW: Ich staune über deine Hilfe ... Danke ...
    12.02.2017 09:07:32
    Dieter(Drummer)
    ... aber man lernt ja nie aus.
    Gruß, Dieter(Drummer)
    Das sind 2 SubProzeduren, robert! ;-) orT
    12.02.2017 13:56:07
    Luc:-?
    Schönen Sonntag, robert,
    muss gleich weg (SchwägerinnenGeburtstag).
    Gruß, Luc :-?
    Fehler darum:
    11.02.2017 18:44:20
    Michael
    Hi Dieter,
    genau dafür hat man ja Option explicit: Du schreibst zelle einmal klein, einmal groß: definiert ist sie halt klein.
    Gruß,
    M.
    Anzeige
    AW: Danke Michael für Hinweis. Gruß owT
    11.02.2017 18:51:01
    Dieter(Drummer)
    sorry, war Mist! Gruß owT
    12.02.2017 14:58:04
    Michael
    Ä, ä, Michael, VBA-VariablenNamen sind ...
    11.02.2017 18:57:29
    Luc:-?
    NICHT case-sensitiv! Wird ein Name klein deklariert, wird er im folgd Pgm (und mitunter auch darüber hinaus!) stets wieder auf klein gestellt und umgekehrt. Das ist nur ein VBE-Service!
    In anderen Sprachen kann das durchaus anders sein, zB in JavaScript.
    Gruß, Luc :-?
    Anzeige
    danke für die Richtigstellung,
    12.02.2017 14:59:20
    Michael
    Luc:-?
    und Grüße,
    Michael

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige

    Infobox / Tutorial

    Zufallszahlen im Zellbereich ohne Duplikate erzeugen


    Schritt-für-Schritt-Anleitung

    Um Zufallszahlen im Zellbereich zu erzeugen, ohne dass es zu doppelten Werten kommt, kannst Du folgenden VBA-Code verwenden. Dieser Code erstellt eine Liste von eindeutigen Zufallszahlen in einem bestimmten Bereich:

    1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
    2. Klicke auf Einfügen und wähle Modul, um ein neues Modul zu erstellen.
    3. Füge den folgenden Code ein:
    Sub ZufallszahlenOhneWiederholung()
        Dim i As Integer
        Dim Zufallszahlen As Collection
        Dim Zufallszahl As Integer
        Dim n As Integer
        Dim ZielBereich As Range
    
        Set ZielBereich = Selection
        n = ZielBereich.Cells.Count
        Set Zufallszahlen = New Collection
    
        Randomize ' Initialisiere den Zufallszahlengenerator
    
        Do While Zufallszahlen.Count < n
            Zufallszahl = Int((20 * Rnd) + 1) ' Zufallszahl zwischen 1 und 20
            On Error Resume Next ' Verhindert den Fehler bei doppelten Einträgen
            Zufallszahlen.Add Zufallszahl, CStr(Zufallszahl) ' Füge nur eindeutige Zahlen hinzu
            On Error GoTo 0
        Loop
    
        i = 1
        For Each Zelle In ZielBereich
            Zelle.Value = Zufallszahlen(i)
            i = i + 1
        Next Zelle
    End Sub
    1. Schließe den VBA-Editor und wähle den Zellbereich, in den die Zufallszahlen eingefügt werden sollen.
    2. Führe das Makro ZufallszahlenOhneWiederholung aus.

    Häufige Fehler und Lösungen

    Fehler: "Zelle = Variable nicht definiert!"
    Lösung: Achte darauf, dass Du die Variable Zelle korrekt definierst. Im obigen Code wird Zelle automatisch als Range-Objekt erkannt. Stelle sicher, dass Du Dim Zelle As Range hinzufügst, falls Du sie explizit definieren möchtest.

    Fehler: Doppelte Zahlen erscheinen trotzdem.
    Lösung: Der Fehler kann auftreten, wenn der Zufallszahlengenerator nicht richtig initialisiert wurde. Verwende Randomize zu Beginn des Codes, um den Zufallszahlengenerator zu initialisieren.


    Alternative Methoden

    Eine weitere Möglichkeit, um Zufallszahlen ohne Wiederholung zu generieren, ist die Nutzung von Excel-Formeln. Du kannst die Funktion RANDBETWEEN in Kombination mit einer Hilfsspalte verwenden.

    Ein Beispiel wäre:

    1. In einer Hilfsspalte (z.B. Spalte A) schreibst Du:
      =RANDBETWEEN(1, 20)
    2. Ziehe die Formel bis zur gewünschten Anzahl von Zellen.
    3. Sortiere die Ergebnisse, um die Duplikate zu entfernen.

    Für eine Excel-Zufallsmatrix ohne Wiederholung kannst Du die SORT-Funktion verwenden (in neueren Excel-Versionen verfügbar).


    Praktische Beispiele

    Hier sind zwei praktische Anwendungsbeispiele für die Nutzung eines Zufallsgenerators in Excel:

    1. Zufallszahlen aus einer Liste ohne Wiederholung: Verwende den oben genannten Code, um eine Liste von Zufallszahlen zu erstellen, die nur einmal vorkommen.

    2. Zufallszahl aus einem bestimmten Bereich: Wenn Du nur eine bestimmte Anzahl von Zufallszahlen (z.B. 1 bis 10) generieren möchtest, passe die obere Grenze im Code an:

      Zufallszahl = Int((10 * Rnd) + 1) ' Zufallszahl zwischen 1 und 10

    Tipps für Profis

    • Verwende die Option Explicit-Anweisung am Anfang Deines VBA-Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Schreibfehler und logische Fehler zu vermeiden.
    • Experimentiere mit der RANDBETWEEN-Funktion in Kombination mit anderen Funktionen, um noch komplexere Zufallszahlen oder -listen zu erstellen.
    • Wenn Du häufig Zufallszahlen benötigst, erstelle eine benutzerdefinierte Funktion (UDF), die Du einfach in Deinen Excel-Arbeitsblättern verwenden kannst.

    FAQ: Häufige Fragen

    1. Was ist der Unterschied zwischen RND und RANDBETWEEN in Excel?
    RND generiert eine Zufallszahl zwischen 0 und 1, während RANDBETWEEN eine Zufallszahl in einem von Dir festgelegten Bereich (z.B. zwischen 1 und 20) erzeugt.

    2. Wie kann ich den Zufallszahlengenerator in Excel zurücksetzen?
    Du kannst den Zufallszahlengenerator zurücksetzen, indem Du die Randomize-Anweisung im VBA-Code verwendest. Dadurch wird der Generator mit einem neuen Startwert initialisiert.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige