Excel - 基于其他2列生成随机数

时间:2016-01-18 15:10:52

标签: excel excel-vba vba

我不确定如何完成以下任务: 在columnA上我有数字,在columnB上我有与这些数字相关联的名称。

我希望能够从A列生成一个随机数,但只能从列B上没有任何关联的数字中生成。例如:如果我在A1中有一个数字,但我没有B1中的名称,A1中的数字应该是可以随机生成的数字之一。

如果A2有一个数字,且B2不为空(它有一个名字),我不希望A2在随机范围内。

此外,能够并重新生成随机数会很棒(也就是说,如果我指定一个数字,比方说,321,我希望能够以某种方式再次生成随机数,但它不应该考虑已经分配的321)。

我很感激任何想法。

样品

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

根据您的示例数据/电子表格,执行以下操作:

1)在Cell C1中:输入值" 0"

2)在Cell C2中:把公式:

=IF(ISBLANK(B2), 1, 0)+OFFSET(C2,-1,0,1,1)

3)将C2中的公式与所有数据一起复制。

4)将此公式放在您想要显示来自A列的随机化#的任何位置:

=OFFSET(A1,MATCH(RANDBETWEEN(1,COUNTA(A:A)-COUNTA(B:B)),C:C,0)-1,0,1,1)

答案 1 :(得分:1)

我认为使用工作表函数会很难。这是一种快速而肮脏的方法,至少在某些时候起作用---

  1. 在两个(或更多)单元格中,添加公式=RANDBETWEEN(COLUMN(A1),COLUMN(D1)),将A1D1替换为您的数字行中的第一个和最后一个单元格。这将选择随机列号。
  2. 为每个单元格指定一个唯一名称,例如therandtherand2,....
  3. 在另一个单元格中,添加=IF(ISBLANK(INDIRECT(ADDRESS(2,therand))),INDIRECT(ADDRESS(1,therand)),INDIRECT(ADDRESS(1,therand2)))。这将检查第一个随机列号是否对应于空白标签(ISBLANK(...)),如果是,则使用相应的第1行值。如果没有,它将使用第二个随机列号中的第1行值。
  4. 点击F9重新计算。
  5. 这并不总能为您提供空白标记的单元格。添加更多随机列号和相应的IF(...)子句,以减少错误选择的可能性。

    编辑:您在原始问题中说“行A”,但我看到您的意思是“A列”(而不是“第1行”)。您需要转换上面公式中的行和列以使它们起作用。

答案 2 :(得分:1)

这是VBA答案。它可以直接用作工作表函数:

Function RandUnassigned(R As Range) As Variant
    Application.Volatile
    Dim A As Variant, i As Long, n As Long
    Dim num As Long
    n = R.Rows.Count

    ReDim A(1 To n)
    For i = 1 To n
        If Len(R.Cells(i, 2)) = 0 Then
            num = num + 1
            A(num) = R.Cells(i, 1)
        End If
    Next i
    RandUnassigned = A(Application.WorksheetFunction.RandBetween(1, num))
End Function

像这样使用:

enter image description here

每次电子表格执行此操作时都会重新计算。如果您希望它只绘制一次随机数,请从函数定义中删除行Application.Volatile