我不确定如何完成以下任务: 在columnA上我有数字,在columnB上我有与这些数字相关联的名称。
我希望能够从A列生成一个随机数,但只能从列B上没有任何关联的数字中生成。例如:如果我在A1中有一个数字,但我没有B1中的名称,A1中的数字应该是可以随机生成的数字之一。
如果A2有一个数字,且B2不为空(它有一个名字),我不希望A2在随机范围内。
此外,能够并重新生成随机数会很棒(也就是说,如果我指定一个数字,比方说,321,我希望能够以某种方式再次生成随机数,但它不应该考虑已经分配的321)。
我很感激任何想法。
样品
答案 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)
我认为使用工作表函数会很难。这是一种快速而肮脏的方法,至少在某些时候起作用---
=RANDBETWEEN(COLUMN(A1),COLUMN(D1))
,将A1
和D1
替换为您的数字行中的第一个和最后一个单元格。这将选择随机列号。therand
,therand2
,.... =IF(ISBLANK(INDIRECT(ADDRESS(2,therand))),INDIRECT(ADDRESS(1,therand)),INDIRECT(ADDRESS(1,therand2)))
。这将检查第一个随机列号是否对应于空白标签(ISBLANK(...)
),如果是,则使用相应的第1行值。如果没有,它将使用第二个随机列号中的第1行值。这并不总能为您提供空白标记的单元格。添加更多随机列号和相应的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
像这样使用:
每次电子表格执行此操作时都会重新计算。如果您希望它只绘制一次随机数,请从函数定义中删除行Application.Volatile
。