繁体   English   中英

Excel拼图中的Excel Randbetween

[英]Excel Randbetween in excel puzzle

这是我的问题。

如果单元格 A1 不为空,那么我想从列表中选择一个随机名称(名称是 Ben、Bill、Bob)。 公式如下: IF(A1<>"",INDEX(Q:Q,RANDBETWEEN(2,COUNTA(Q:Q))))

到现在为止还挺好...

但是,假设 A1 = Ben、Bill 或 Bob,那么我希望我的公式排除该名称并从列表中选择另一个名称。

我无法弄清楚如何烦人地做到这一点。 非常感谢任何帮助,谢谢。

旧版本的选项:

=IF(A1<>"",INDEX(Q:Q,AGGREGATE(15,6,ROW(Q:Q)/((Q:Q<>A1)*(Q:Q<>"")),RANDBETWEEN(1,SUMPRODUCT((Q:Q<>"")*(Q:Q<>A1))))))

在此处输入图片说明

评论中的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,其中我们使用之前的总和公式作为上限。 比第一个更黑客,但它应该仍然有效。

在 ms 365 中使用动态数组功能,请尝试:

在此处输入图片说明

B1公式:

=@SORTBY(FILTER(D1:D3,D1:D3<>A1),RANDARRAY(2))

注 1: RANDARRAY()可以更动态一点: RANDARRAY(COUNTA(D1:D3)-1)

注2:使用LET()可以写成=@LET(A,D1:D3,SORTBY(FILTER(A,A<>A1),RANDARRAY(COUNTA(A)-1)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM