You are currently viewing Zufällige Codes für allerlei Zwecke generieren – ohne Duplikate

Zufällige Codes für allerlei Zwecke generieren – ohne Duplikate

Ich wurde gefragt, ob es eine Möglichkeit gibt, in Excel 500 Zufallscodes in einem Rutsch, bspw. für Kundenrabatte, nach Vorgaben zu generieren, die dann, über ein weiteres Script, in eine Datenbank eingespeist werden oder als Etikett ausgedruckt werden können. Ja – mit VBA kann man das machen.

Das hier gezeigte Script begrenzt sich auf das Erstellen der Zufallscodes.

Die Vorgaben waren Folgende:

  • Die Anzahl der Zufallcodes sollte variabel sein
  • Die Codes sollten aus Zufallszahlen und einer zufälligen Anordnung von Buchstaben bestehen
  • Die Zufallcodes sollten aus 3 Gruppen zu je 5 Zeichen bestehen
  • Als Buchstaben sollten nur Grossbuchstaben verwendet werden
  • Die Zufallcodes sollten auf mehrere Spalten verteilt werden und die Anzahl der verwendeten Spalten sollte durch den Anwender festgelegt werden können
  • Kein Zufallscode sollte doppelt vorkommen

Dieses Script generiert (mehr als) 500 Zufallcodes (3×5 Zeichen pro Zufallcode ) in einer Laufzeit < 1 Sekunde. Wenn man die Kommentare (Text nach den Hochkammata) entfernt, ist das Script relativ klein und übersichtlich. Kopieren Sie dieses Script in ein neues Modul, im VBA-Editor Ihrer Excel-Arbeitsmappe und klicken Sie in der Symbolleiste auf „Ausführen“ oder drücken Sie F5 auf Ihrer Tastatur um das Script zu testen.

Folgende Dinge sollte man bei Anwendung des Scriptes berücksichtigen:

  • Dieses Script prüft nicht, ob eine zulässige Anzahl von Spalten als Vorgabe eingegeben wurde
    (Bei 500 Zufallcodes (50 Zeilen bei 10 Spalten) sollten 1.048.576 Zeilen und 16.384 Spalten ausreichen 😉
  • Die Anzahl der verwendeten Zeilen ist durch die Auswahl der verwendeten Spalten abhängig und wird berechnet
  • Das Script prüft nicht, ob die Tabelle1 vorhanden und/oder schreibgeschützt ist

Dieses Script kann u.a. auch verwendet/angepasst werden für:

  • Rabattcodes
  • Lizenzcodes
  • Zufalls-Links oder Zufalls-Dateinamen
  • Zufällige Passwörter generieren
  • u.v.a. mehr…
Option Explicit
Option Base 1

Sub ZufallsCode()

    'Laufzeit des Makros bei 6500 Codes
    'und 3 x 5 Zeichen pro Code-Gruppe: < 1 Sekunde

    Dim i As Long, nTest As Long, n As Long, z As Long, s As Long, g As Boolean
    Dim nC As Long, nS As Long, nZ As Long, nGr As Long, nZn As Long, nR As Long
    Dim zufText As String, zufZahl As Long, OG As Byte, UG As Byte
    Dim arr_Code() As String
    
    nC = 300        'Anzahl Codes, die erstellt werden sollen
    nS = 10         'Anzahl der Spalten, die befüllt werden sollen
                    'die Zeilenanzahl wird berechnet!

    n = 1           'Start-Zähler
    zufZahl = 0     'Zufallszahl (Zahl)
    zufText = ""    'Zufallstext (String)
    OG = 10         'Obergrenze Zufallszahl
    UG = 0          'Untergrenze Zufallszahl
    
    'Prozedur nicht ausführen wenn die Eingaben = 0,
    'leer oder nicht numerisch sind
    If Not IsNumeric(nC) Or nC = 0 Then Exit Sub
    If Not IsNumeric(nS) Or nS = 0 Then Exit Sub
    
    'Abschalten, was bei der Erstellung
    'der Codes nicht benötigt wird:
    With Application
        .ScreenUpdating = False
        .Calculation = False
        .EnableEvents = False
    End With
    
    With ThisWorkbook.Sheets("Tabelle1")
        'Tabelle1 leeren
        .Cells.ClearContents
        'Zufallsgenerator initiieren
        Randomize
        
        'Schleife solange ausführen, bis n kleiner gleich Anzahl der Codes nC
        Do While n <= nC
            g = False
            'Anzahl der Gruppen je Zufalls-Code:
            For nGr = 1 To 3
                'Anzahl der Zeichen je Zufalls-Code-Gruppe:
                For nZn = 1 To 5
                    zufZahl = Int((OG - UG + 1) * Rnd + UG)
                    Select Case zufZahl
                        Case 4, 8
                            'zufällige Zahlen bilden:
                            zufText = zufText & Int((OG - 0) * Rnd + UG)
                        Case Else
                            'zufällige Buchstaben bilden:
                            zufZahl = Int((90 - 65 + 1) * Rnd + 65)
                            zufText = zufText & Chr(zufZahl)
                    End Select
                Next
                zufText = zufText & IIf(nGr < 3, "-", "")
            Next
            'den ersten Code ins Array eintragen
            'und danach alle Anderen auf Duplikate prüfen:
            If n = 1 Then
                ReDim arr_Code(n)
                arr_Code(n) = zufText
                zufText = ""
                n = n + 1
            Else
                'Einträge im Array auf Duplikate prüfen:
                For nTest = 1 To UBound(arr_Code)
                    If arr_Code(nTest) = zufText Then
                        g = True '< Eintrag bereits vorhanden
                        zufText = ""
                        Exit For
                    End If
                Next
                'Wenn der Zufallscode nicht im Array vorhanden ist,
                'wird er im Array eingetragen:
                If g = False Then
                    'Array um einen Eintrag vergrößern:
                    ReDim Preserve arr_Code(n)
                    'Den neuen Zufallscode dem Array hinzufügen:
                    arr_Code(n) = zufText
                    zufText = ""
                    n = n + 1
                End If
            End If
        Loop
        
        'Codes in Tabelle eintragen
        'Berechnung der notwendigen Zeilen:
        nR = nC \ nS
        nZ = nR + IIf(nC Mod nS > 0, 1, 0)
        'Zähler zurücksetzen (Option Base 1!):
        n = 1
        For s = 1 To nS '< erste Schleife für die zu befüllenden Spalten
            For z = 1 To nZ '< zweite Schleife für die berechnete Anzahl der Zeilen
                .Cells(z, s).Value = arr_Code(n) '< Zufallscode in Zelle eintragen
                If n < UBound(arr_Code) Then
                    n = n + 1
                Else
                    'Schleife verlassen wenn
                    'alle Codes eingetragen wurden:
                    Exit For
                End If
            Next z
        Next s
    End With

    'Alles wieder einschalten, was bei der Erstellung
    'der Codes abgeschaltet wurde:
    With Application
        .EnableEvents = True
        .Calculation = True
        .Calculate
        .ScreenUpdating = True
    End With

End Sub

Ich freue mich über Meinungen, Ideen oder Kritik… schreiben Sie mir eine E-Mail »