[英]Excel Randbetween in excel puzzle
这是我的问题。
如果单元格 A1 不为空,那么我想从列表中选择一个随机名称(名称是 Ben、Bill、Bob)。 公式如下: IF(A1<>"",INDEX(Q:Q,RANDBETWEEN(2,COUNTA(Q:Q))))
到现在为止还挺好...
但是,假设 A1 = Ben、Bill 或 Bob,那么我希望我的公式排除该名称并从列表中选择另一个名称。
我无法弄清楚如何烦人地做到这一点。 非常感谢任何帮助,谢谢。
评论中的EDIT Pb 指出我的过滤器可以从
FILTER(FILTER(F:F,F:F<>""),FILTER(F:F,F:F<>"")<>A1)
到
FILTER(F:F,(F:F<>"")*(F:F<>A1))
制作最终功能:
=INDEX(
FILTER(F:F,(F:F<>"")*(F:F<>A1)),
RANDBETWEEN(1, COUNTA(FILTER(F:F,(F:F<>"")*(F:F<>A1))))
)
如果您使用的是具有 FILTER 的 Excel 版本,则可以使用它来过滤名称列表,获取计数,然后将该过滤列表与使用该计数的 RANDBETWEEN 一起传递给 INDEX。 假设您的姓名列表在 Col F 中:
=INDEX(
FILTER(FILTER(F:F, F:F<>""), FILTER(F:F, F:F<>"")<>A1),
RANDBETWEEN(1, COUNTA(FILTER(FILTER(F:F, F:F<>""), FILTER(F:F, F:F<>"")<>A1)))
)
我将 F 传递给 FILTER 两次,一次删除空行,一次删除 A1 中的任何名称。 这是基本的过滤列表:
FILTER(FILTER(F:F,F:F<>""),FILTER(F:F,F:F<>"")<>A1)
如您所见,我将相同的过滤列表传递给 COUNTA 并在 RANDBETWEEN 中使用它从列表中获取索引。
这是一个使用 FILTERXML 过滤列表的版本。 这应该在 2012 年之前的 Windows 版本中得到支持:
=INDEX(
FILTERXML("<a><x>" & TEXTJOIN("</x><x>", TRUE, IF((F:F<>A1)*(F:F<>"")>0, F:F, "")) & "</x></a>", "//x"),
RANDBETWEEN(1, SUM((F:F<>A1)*(F:F<>"")))
)
在这里,我们将使用数组产品来生成匹配条件列表。 我们可以使用传递给 sum 的数组 product 来获取 RANDBETWEEN 的计数,也可以使用它来过滤名称列表,然后将该列表传递给 TEXTJOIN 将其转换为 xml 字符串,然后使用 FILTERXML 将节点值解析回来成一个数组。
F:F=A1
将返回一个真/假数组,而(F:F=A1)*(F:F<>"")
将返回一个真/假数组,其中 F 与两个条件都匹配。 我们可以将其传递给 SUM 以获取计数:
=SUM((F:F<>A1)*(F:F<>""))
我们还可以将此数组传递给 IF 并获得匹配名称的列表。 我们将告诉 IF 如果为 TRUE 则返回 F 的值,或者如果为 FALSE 则返回“”。
IF((F:F<>A1)*(F:F<>"")>0, F:F, ""))
或者到 TEXTJOIN,告诉它忽略空值,使用分隔符生成一个 xml 字符串:
="<a><x>" & TEXTJOIN("</x><x>", TRUE, IF((F:F<>A1)*(F:F<>"")>0, F:F, "")) & "</x></a>"
然后使用 FILTERXML 和 //x 以数组形式检索 x 节点的值。 然后我们将该结果与 RANDBETWEEN 一起传递给 INDEX,其中我们使用之前的总和公式作为上限。 比第一个更黑客,但它应该仍然有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.