Zahlen nicht doppelt vergeben

Basiic

Grünschnabel
Hallo zusammen,
bevor ihr auf einen anderen Thread verweist lest euch erstmal mein Problem durch.
Ich habe drei Tabellen, in denen unterschiedliche Werte stehen, die dann übergreifend verwendet werden.
In meinem Fall habe ich eine Liste mit einer festen Anzahl Artikelnummern.
Die Spalte in der diese stehen wird ausgelesen und die Anzahl an Artikeln ermittelt. Mit Hilfe dieser Zahl nehme ich dann zufällig einen Artikel aus der Liste und setze ihn in einer anderen Tabelle ab. Jedoch darf in der anderen Tabelle diese Artikelnummer nicht doppelt aufgelistet werden. Wie kann ich das umsetzen.

Hier der relevante Teil-Code:

Code:
For q = 1 To Bon
                        Artikelnr = CInt(Round(Int(((Anzahlzeilen) - 2 + 1) * Rnd()))) + 2
                        Artnr = Worksheets("Artikel").Cells(Artikelnr, 1).Value
                        Worksheets("Item").Cells(w, 2) = Artnr
                        Worksheets("Item").Cells(w, 1) = y
                        w = w + 1
                    Next q
 
Vornweg. Es scheint Excel zu sein.

Ich sehe im Moment noch keinen Zusammenhang zwischen deiner Erklärung und deinem Code.

Ich geh mal davon aus, dass Artikel die Tabelle mit den Quelldaten ist und Item die Zieltabelle.
Wie ich das verstehe, willst du aus Artikel einen belibigen auslesen und nach Item schreiben, sofern er dort noch nicht vorhanden ist.

Stimmt das so?
 
Stimmt, ich habe mich ein wenig missverständlich ausgedrückt.
Du verstehst das soweit richtig.

Ich habe eine Tabelle die lautet Kopfdaten.
In dieser werden Datum (bis zu 100x das gleiche, aber einen Monat) mit einer zufälligen Uhrzeit und einer Bonnummer(Entspricht je einem Datum mit zugehöriger Uhrzeit) aufgelistet.
Aus dieser wird die Bonnummer in die Tabelle Item übertragen.
Diese Bonnummer kann je nach Anzahl von Artikeln aus der Tabelle Artikel mehrmals aufgelistet werden.
Einer Bonnummer soll aus der Tabelle Artikel zufällig unterschiedliche Artikelnummern zugeordnet werden, die aber nicht doppelt vorkommen dürfen. ( Mein Problem )

Beispiel; So soll es aussehen:
Bonnummer: Artikelnummer:
1 2157
1 2158
1 2758
2 2157
2 2158
2 2758

Eine Bonnummer darf nur einen Artikel der selben Artikelnummer enthalten.
 
Zuletzt bearbeitet:
Kleine Gegenfrage. Pro Bonnummer darf der Artikel nicht doppelt vorkommen oder insgesammt nicht doppelt?
Ich denke das 2te. Also eine Art Lotterie.

Hier mal ein Beispiel, wie man 4 verschieden zufällige Zeilen auswählen kann, ohne dass eine Doppelt gewählt wird

Visual Basic:
Option Explicit

Public Sub test()
    Dim wsSource As Worksheet
    Dim anzahl As Long
    Dim stackRowNr As New Collection
    Dim i As Long
    Dim rowNr As Long
    Dim index As Long
    
    Set wsSource = Worksheets("Artikel")
    anzahl = 4
    
    'Die Zeilennummern in den Stack schreiben
    For rowNr = 2 To xlsGetLastRow(wsSource)
        stackRowNr.Add rowNr
    Next rowNr
   
    
    'Aus der F1-Hilfe:  Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
        
    'Für die Anzahl gesuchter Einträge
    For i = 0 To anzahl - 1
        'Zufällig einen Index asuwählen
        index = Int(stackRowNr.Count * Rnd) + 1
        'Der Wert aus dem Stack lesen
        rowNr = stackRowNr(index)
        'Eintrag aus dem Stack entfernen
        stackRowNr.Remove index
        '//TODO: Mach etwas mit dem Eintrag, der Zeile
        Debug.Print rowNr
    Next i

End Sub



'/**
' * Ermittelt die letzte gefüllte Zeile eines Worksheets
' * @param  Worksheet   Das Worksheetobjekt, das durchsucht werden soll
' * @return Long        Die Zeilennummer. Wenn das ganze Sheet leer ist, ist der Rückgabewert 0
' */
Private Function xlsGetLastRow(ByRef sheet As Object) As Long
    Const xlCellTypeLastCell = 11

    'Zur letzten initialisierten Zeile gehen
    xlsGetLastRow = sheet.Cells.SpecialCells(xlCellTypeLastCell).Row
    
    'Von dort zurücksuchen bis zur Letzten zeile mit Inhalt
    Do While sheet.Application.WorksheetFunction.CountA(sheet.Rows(xlsGetLastRow)) = 0 And xlsGetLastRow > 1
        xlsGetLastRow = xlsGetLastRow - 1
    Loop
End Function
 
Zuletzt bearbeitet:
Kleine Gegenfrage. Pro Bonnummer darf der Artikel nicht doppelt vorkommen oder insgesammt nicht doppelt?
Leider trifft die erste Variante zu. Sprich es darf pro Bonnummer die Artikel nicht doppelt vorkommen, aber auf der nächsten wieder.
Ich habe anhand deines Codes versucht es an meinen Fall anzupassen, jedoch kommen immernoch gleiche Artikel pro Bonnummer auf. Anbei noch etwas mehr Input. ( Falls mein bisheriger Weg programmiertechnisch eigentlich zu kompliziert ist, bitte ich das doch trotzdem erstmal zu missachten)

AnzahlZeilen = Die Anzahl an zeilen in Tabelle "Artikel" für die Artikelnummer
Artnr = Entnimmt die Artikelnummer aus der zufällig gewählten Zeile von Artikelnr
artpreis = Entnimmt die Artikelpreis aus der zufällig gewählten Zeile von Artikelnr
mwst = Entnimmt die Artikelmehrwertsteuer aus der zufällig gewählten Zeile von Artikelnr

Visual Basic:
For q = 1 To Bon
               Artikelmenge = CInt(Round(Int((5 - 1 + 1) * Rnd()))) + 1
               Artikelnr = CInt(Round(Int(((Anzahlzeilen) - 2 + 1) * Rnd()))) + 2
               Artnr = Worksheets("Artikel").Cells(Artikelnr, 1).Value
               artpreis = Worksheets("Artikel").Cells(Artikelnr, 2).Value
               mwst = Worksheets("Artikel").Cells(Artikelnr, 3).Value

               mwst1 = mwst / 100
               prozent = artpreis * mwst1
               artendpreis = artpreis + prozent

               Worksheets("Item").Cells(w, 1) = y
               Worksheets("Item").Cells(w, 2) = Artnr
               Worksheets("Item").Cells(w, 3) = Artikelmenge
               Worksheets("Item").Cells(w, 4) = artpreis
               Worksheets("Item").Cells(w, 5) = mwst
               Worksheets("Item").Cells(w, 6) = Artikelmenge * artendpreis
               w = w + 1
Next q
 
Zurück