从列表中select随机名称
我试图使用一个公式,它可以让我从355个名字中随机抽取183个名字。 我的Excel工作表看起来像这样:
Names Random.Names Paty Oscar John Anna Jane Carlos Maria Jennifer Susan Kayla
在我的实际工作表上,我有更多的名字,但这只是一个例子。 我使用了下面的公式,但是我有几个在随机化后显示#REF的单元格。
=IF(ROWS($1:1)>$E$2,"",INDEX($A$8:$A$355,RANDBETWEEN(1,354)))
请让我知道,如果你有一个更好的公式,或者如果你知道我做错了什么。
这是因为INDEX是相对的,所以第8行是1,第355行是355-8 + 1 = 348.将RANDBETWEEN改为1348
任何大于引用的单元格数量都会产生错误。
=IF(ROWS($1:1)>$E$2,"",INDEX($A$8:$A$355,RANDBETWEEN(1,348)))
或者你可以参考整个列并使用8355:
=IF(ROWS($1:1)>$E$2,"",INDEX($A:$A,RANDBETWEEN(8,355)))
A8和A355之间没有355个名字,只有355-8 + 1。
所以修复RANDBETWEEN()
遵循我以前的anwser的逻辑
你只需要打开你的VBA编辑器粘贴下面的代码:
'By Julio Jesus Luna Moreno 'jlqmoreno@gmail.com Option Base 1 Public Function UNIQRAND(a As Variant, b As Variant) As Variant Application.Volatile Dim k%, p As Double, flag As Boolean, x() As Variant k = 1 flag = False ReDim x(1) x(1) = Application.RandBetween(a, b) Do Until k = b - a + 1 Do While flag = False Randomize p = Application.RandBetween(a, b) 'Debug.Assert p = 2 resultado = Application.Match(p, x, False) If IsError(resultado) Then k = k + 1 ReDim Preserve x(k) x(k) = p flag = True Else flag = False End If Loop flag = False Loop UNIQRAND = x End Function
这个函数将会诀窍
Public Function RANDNAMES(Rango As Range, HowMany As Integer) As Variant Dim n, p(), x(), i As Variant n = Rango.Rows.Count If n < HowMany Then MsgBox "Number of pairs must be less than number of total elements" Exit Function End If ReDim x(HowMany) ReDim p(n) p = UNIQRAND(1, n) For i = 1 To HowMany Step 1 x(i) = Application.Index(Rango, p(i)) Next i Debug.Print HowMany RANDNAMES = Application.Transpose(x) End Function