2017-07-26 35 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