从列表中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))) 

A8A355之间没有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