2

我需要翻译一个在 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,排名(B2,$B$2:$B$74))

我的名字在列 $A 中,我的随机值在列 $B 中。我要说的是,对列 B 中的 B2(然后是 B3,然后是 B4 等)中的值进行排名。

我想要的是将 COUNTA 集成到第二个函数中,并且(如果可能)采用 RANDBETWEEN 而不是 rank 函数,这样我就没有难看的数字了。

我愿意使用带有某种重复检查的第一个功能。只要秘书不用做很多操作,应该没问题。

非常感谢您的帮助 xox

4

2 回答 2

1

我在 VBA 中创建了一些我认为你想要的东西。现在请记住,我对 VBA 很陌生,所以它可能不是最漂亮的东西。为了清楚起见,我在 A 列中从第 1 行到第 10 行有 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,因为删除行时该单元格不会受到影响。

我希望这会有所帮助,如果这不是您想要的,我会看看是否可以对其进行一些改进。

于 2012-07-18T21:00:46.927 回答
0

在 VBA(谷歌 Excel Random Unique)中有很多可用于执行此操作的示例,其中最好的一个来自CPearson.Com,其中包括(除其他外):

来自工作表单元格范围的随机元素
您还可以创建一个函数,该函数以随机顺序返回多个元素,并且在工作表单元格范围内没有重复元素。下面的函数就是这样做的。
您可以使用像=RandsFromRange(A1:A10,5)这样的公式调用数组公式,
其中 A1:A10 是从中提取值的元素列表,5 是要返回的值的数量。在包含指定要返回的单元格的区域中输入公式,然后按 CTRL SHIFT ENTER 而不是仅按 ENTER。

如果您不想使用 VBA,那么可以通过几个简单的步骤来完成:

  1. 在您的学生姓名旁边插入一列,其中包含公式=RAND()
  2. 对数字上的名称和随机数列表进行排序
  3. 从列表顶部选择尽可能多的学生
  4. 每次排序时,您都会得到一个新的随机排序
于 2012-07-18T21:46:16.410 回答