2017-07-26 47 views
0

我工作的隨機數VBA和下面的代碼從挑選和Sheet2的副本名稱表1,我可以重複這些步驟來接從該列表3個不同的名稱。如果三個連續的行都是三個連續的行,但這些代碼在第5行,第10行和第15行中沒有選擇3個不同的名稱,那麼這個代碼做得很好。有人可以幫我挑三個不同的名字,並將它們放在相距5行的行中嗎? (第一行第一名,第五行第二名,第十五行第三名)我是VBA新手!輸出隨機數在三個不同的行

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

不回答你的問題,而是'點心源,目的地Range'將目的地的範圍內,但消息人士的變種。你需要'Dim source作爲Range,destination As Range' – jcarroll

+0

這裏有一點小小的格式化。 – RBarryYoung

回答

0

如果我理解正確的話,如果你改變線路

For i = 1 To destination.Rows.Count 

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

這應該工作。雖然當我嘗試它時,我還必須使目標範圍大於「B53」。我把「B53:B99」

+0

嗨Rob ..謝謝你的迴應。我試圖提出您的建議,但它不起作用。問題是範圍不能變大。我有一些限制,以獲得更大的範圍。要重新迭代,宏應該從一個範圍中提取三個不同的名稱(相互排斥),並將這三個名稱放在相距5行的三個不同行中。 – Muni0408

+0

當我嘗試運行代碼(如給定的),我得到的細胞B53一個值,則該錯誤消息「沒有更多的空間在目標範圍內。這是因爲你的範圍是一個小區,這樣一個已複製的一件事,有。沒有更多的房間在最起碼的範圍必須B53:!B63以適應三個項目的數據,五個格除了 –

+0

好吧,我在一個單獨的宏中使用「呼叫」功能,調用此宏三次讓我得到三個不同的名字。我是新來的VBA和我使用的方法可能是很原始的。現在我意識到它不會與這種方法的工作。有沒有更好的辦法? – Muni0408