【问题标题】:pick random names from a list从列表中选择随机名称
【发布时间】:2017-07-12 14:31:13
【问题描述】:

我正在尝试使用一个公式,它允许我从 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)))

如果您有更好的公式或者您知道我做错了什么,请告诉我。

【问题讨论】:

  • 您想保证 183 个不同的名称吗?还是只有 183 个随机选择的名替换?
  • 提醒一句,如果您不提供反馈,通过选择正确的答案,人们将停止回答您的问题。请通过单击您使用的答案的复选标记来标记正确的答案。
  • 我想我发现了自己的错误。
  • 我改为 (1, 182) 而不是 (1,354)
  • Tauger - 每次随机化时我都想要 183 个不同的名称

标签: excel random


【解决方案1】:

那是因为 INDEX 是相对的,所以第 8 行是 1,第 355 行是 355-8+1 = 348。将 RANDBETWEEN 更改为 1,348

任何大于引用的单元格数都会产生错误。

=IF(ROWS($1:1)>$E$2,"",INDEX($A$8:$A$355,RANDBETWEEN(1,348)))

或者您可以引用整列并使用 8,355:

=IF(ROWS($1:1)>$E$2,"",INDEX($A:$A,RANDBETWEEN(8,355)))

【讨论】:

  • 嗨 Scott,这是随机化 355 个名字还是 183 个名字?
  • 这将查看 355 个名称列表并从该列表中随机选择一个。如果您想要该列表中的 183 个名称,您将复制此公式 183 次。
【解决方案2】:

A8A355之间没有355个名字,只有355-8+1。

所以修复 RANDBETWEEN()

【讨论】:

  • 是的,你是对的。我没有注意到这一点。谢谢!
【解决方案3】:

按照我previous 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多