2017-07-26 4 views
0

Ich arbeite an Zufallszahlen VBA und der unten genannte Code wählt einen Namen aus Blatt2 und Kopien auf Blatt 1 und ich kann diese Schritte wiederholen, um 3 verschiedene Namen aus dieser Liste auszuwählen. Dieser Code macht einen fantastischen Job, wenn alle drei Namen in drei aufeinander folgenden Zeilen stehen, aber er versäumt es, drei verschiedene Namen zu wählen, wenn er sich in Zeile 5, Zeile 10 und Zeile 15 befindet. Kann jemand mir helfen, drei verschiedene Namen zu wählen und sie in Reihen zu setzen, die 5 Reihen auseinander liegen? (1. Name in der 1. Reihe, 2. Name in der 5. Reihe und 3. Name in der 15. Reihe) Ich bin neu bei VBA!Ausgabe von Zufallszahlen in drei verschiedenen Zeilen

Sub DDQ1() 
Application.ScreenUpdating = False 
Dim source, destination As Range 
Set source = Sheets("sheet2").Range("A60:A81") 
Sheets("sheet1").Activate 
Set destination = ActiveSheet.Range("B53") 
ReDim randoms(1 To source.Rows.Count) 
destrow = 0 
For i = 1 To destination.Rows.Count 
If destination(i) = "" Then: destrow = i: Exit For 
Next i 
If destrow = 0 Then: MsgBox "no more room in destination range": Exit Sub 
For i = 1 To UBound(randoms): randoms(i) = Rnd(): Next i 
ipick = 0: tries = 0 
Do While ipick = 0 And tries < UBound(randoms) 
tries = tries + 1 
minrnd = WorksheetFunction.Min(randoms) 
For i = 1 To UBound(randoms) 
If randoms(i) = minrnd Then 
    picked_before = False 
    For j = 1 To destrow - 1 
    If source(i) = destination(j) Then: picked_before = True: randoms(i) =  2: Exit For 
    Next j 
    If Not picked_before Then: ipick = i 
    Exit For 
End If 
Next i 
Loop 
If ipick = 0 Then: MsgBox "no more unique name possible to pick": Exit Sub 
destination(destrow) = source(ipick) 
Application.ScreenUpdating = True 
End Sub 
+0

Nicht die Antwort auf Ihr Problem, aber "Dim-Quelle, Ziel als Range" wird Ziel einen Bereich machen, aber Quelle als Variante. Sie brauchen 'Dim Quelle als Bereich, Ziel als Bereich ' – jcarroll

+0

Ein wenig Formatierung würde hier einen langen Weg gehen. – RBarryYoung

Antwort

0

Wenn ich Sie richtig verstehe, wenn Sie die Zeile

For i = 1 To destination.Rows.Count 

zu

For i = 1 To destination.Rows.Count Step 5 

dies funktionieren sollte. Aber als ich es versuchte, musste ich auch den Zielbereich größer als nur "B53" machen. Ich gebe "B53: B99" ein

+0

Hallo Rob .. Vielen Dank für Ihre Antwort. Ich habe versucht, Ihren Vorschlag einzubringen, aber es funktioniert nicht. Das Problem ist, dass die Reichweite nicht größer werden kann. Ich habe bestimmte Einschränkungen, um größere Reichweite zu bekommen. Um erneut zu iterieren, sollte das Makro drei verschiedene Namen (die sich gegenseitig ausschließen) aus einem Bereich ziehen und diese drei Namen in drei verschiedene Zeilen einfügen, die 5 Reihen voneinander entfernt sind. – Muni0408

+0

Wenn ich versuche, Ihren Code (wie angegeben) auszuführen, erhalte ich einen Wert in Zelle B53 und dann die Fehlermeldung "Kein Raum mehr im Zielbereich. Das liegt daran, dass Ihr Bereich EINE Zelle ist, also hat er eine Sache kopiert kein Raum mehr. Zumindest muss der Bereich B53: B63 sein, um in drei Daten zu passen, fünf Zellen voneinander entfernt. –

+0

Ok! Ich benutze die Funktion "Call" in einem separaten Makro, um dieses Makro dreimal aufzurufen, damit ich Ich bin neu bei VBA und die Methode, die ich verwende, könnte sehr primitiv sein. Jetzt merke ich, dass es mit dieser Methode nicht funktionieren wird. Gibt es einen besseren Weg? – Muni0408

Verwandte Themen