我需要翻译一个在AS / 400上工作的旧程序,该程序正在挑选随机学生为我的城市工作。我可以使用任何程序,只要它有效。为了简单快速,我选择了excel。
然而,我遇到了一个小问题。我需要没有重复,因为同一个学生在一个夏天不能做两份工作。此外,我需要灵活,因为每年都会增加新学生,有些学生将被删除。
这个功能几乎和我想要的一样多: 的 = INDEX($ A:$ A,RANDBETWEEN(1,COUNTA($ A:$ A)),1)
索引$ A:$ A获取A列中的所有行。因此,即使我添加了20个名称,也需要考虑它们。然后,它随机选择第1行与$ A列中总行数(COUNTA)之间的值(名称)。这种方法的问题在于它允许重复。
我发现的另一个功能是创建一个充满= ALEA()的列,然后按数字对它们进行排名。这不是很漂亮,但至少没有重复。问题来自我的公式,这是静态的,我不能灵活:
= INDEX($ A $ 2:$ A $ 74 RANK(B2,$ B $ 2:$ B $ 74))
我的名字在colum $ A中,而我的随机值在colum $ B中。我所说的是,将值排在B列中的B2(然后是B3,然后是B4等)。
我想要的是将COUNTA集成到第二个函数中并且(如果可能的话)使用RANDBETWEEN而不是rank函数,这样我就没有丑陋的数字。
我打开使用第一个函数进行某种重复检查。只要秘书不需要做很多操作,就应该没问题。
非常感谢您的帮助xox
答案 0 :(得分:1)
我在VBA中创建了一些我认为你想要的东西。现在记住我对VBA很新,所以它可能不是最漂亮的东西。为了清楚起见,我在第1行到第10行的A列中有10个名字,然后简单地运行这个子程序,它在F列中生成了一个唯一名称列表。这是我的代码:
Sub getRandom()
Do While Application.WorksheetFunction.CountA(Range("A:A")) > 0
Dim count As Integer
count = Application.WorksheetFunction.CountA(Range("A:A"))
Dim name As String
name = Application.WorksheetFunction.Index(Range("A:A"), Application.WorksheetFunction.RandBetween(1, count))
Dim row As Integer
row = Application.WorksheetFunction.Match(name, Range("A:A"), 0)
Range("F11").Select
Selection = name
Rows(row).EntireRow.Delete
Loop
End Sub
如果您想一次获取一个名称,只需删除循环即可。它是如何工作的,它完全与您对INDEX和RANDBETWEEN函数所做的一样,用生成的数字抓取A列中的名称,然后完全删除该行,因此不会生成唯一的名称。
我特意选择了列F和细胞F11,因为当删除行时,该单元格不会受到影响。
我希望这会有所帮助,如果不是你想要的东西,我会看看我是否可以加强它。
答案 1 :(得分:0)
在VBA中有很多可用的例子(谷歌Excel随机唯一)其中一个最好的是来自CPearson.Com,其中包括(其中包括):
来自一系列工作表单元格的随机元素
您还可以创建一个函数,该函数以随机顺序返回多个元素,并且不会从一系列工作表单元格中重复。以下功能就是这样做的。您可以使用类似
的公式调用数组公式 = RandsFromRange(A1:A10,5)
其中A1:A10是从中拉取值的元素列表,5是要返回的值的数量。在您指定要返回的单元格数量的范围内输入公式,然后按CTRL SHIFT ENTER而不是ENTER。
如果您不想使用VBA,那么可以通过几个简单的步骤完成:
=RAND()