【问题标题】:Why my ArrayFormula is giving error? How do I correct it? (I'm not looking for another Arrayformula as solutions!)为什么我的 ArrayFormula 给出错误?我该如何纠正? (我不是在寻找另一个 Arrayformula 作为解决方案!)
【发布时间】:2021-06-16 12:03:46
【问题描述】:

我想要一个 C1 的 ArrayFormula,它给出了所需的结果,如图所示。

报名表:
(C栏是我的必填栏)

输入的日期是为名称分配组的日期,即 a、b、c、d、e、f

标准:

  1. count 的值纯粹基于输入的日期(如果 john 在最低日期(10-Jun)被分配 a 那么 count 值为 1,如果 rose 被分配 a 倒数第二个日期(17-6 月),则计数值为 2)。
  2. 即使数据以任何方式排序,count 的值也不会改变,因为 Date Entered 列的值始终是永久的并且不会改变。
  3. 新条目日期可以是任何日期,不一定是最高日期(如果一个名为 Rydu 的新条目在 6 月 9 日被分配 a 那么它的计数值将变为 1,然后 john's (10- Jun) 将变为 2 等等)

示例:

在我以任意随机顺序对数据进行排序后,这样说:

随机排序表:
(计数值保持不变)

当我在(第 4 行和第 14 行)之间和最后一行(第 17 行)之后执行新条目时:

随机排序表:
(无论我在哪里做)


我已经得到了一个给出所需结果的 ArrayFormula:

={"AF Formula1"; ArrayFormula(IF(B2:B="", "", COUNTIFS(B$2:B, "="&B2:B, D$2:D, <"&D2:D)+1))}


我不是在寻找另一个 Arrayformula 作为解决方案。 我想知道我的 ArrayFormula 出了什么问题?我该如何纠正?

我试图找出我自己的 ArrayFormula 但它不起作用:

我得到了每个单元格的公式:
=RANK($D2,FILTER($D$2:$D, $B$2:$B=$B2),1)
我发现 Filter 不适用于 ArrayFormula,所以我不得不采取不同的方法。

我从之前的 question answer(H3 的 Arrayformula)那里得到了帮助,这很相似,因为在这两种情况下,每个单元格 FILTER 公式都返回超过 1 个值。 (其实是player0回答的)

使用相同的技术,我想出了这个绝对有效的公式:

=RANK($D2, ARRAYFORMULA(TRANSPOSE(SPLIT(VLOOKUP($B2, SUBSTITUTE(TRIM(SPLIT(FLATTEN(QUERY(QUERY({$B:$B&"×", $D:$D}, "SELECT MAX(Col2) WHERE Col2 IS NOT NULL GROUP BY Col2 PIVOT Col1", 1),, 9^9)), "×")), " ", ","), 2, 0), ","))), 1)

现在,当我尝试将其转换为 ArrayFormula 时: ($D2 到 $D2:$D & $B2 到 $B2:$B

=ARRAYFORMULA(RANK($D2:$D,TRANSPOSE(SPLIT(VLOOKUP($B2:$B, SUBSTITUTE(TRIM(SPLIT(FLATTEN(QUERY(QUERY({$B:$B&"×", $D:$D}, "SELECT MAX(Col2) WHERE Col2 IS NOT NULL GROUP BY Col2 PIVOT Col1", 1),, 9^9)), "×")), " ", ","), 2, 0), ",")), 1))

它给了我一个错误“在 VLOOKUP 评估中找不到值''”,当我将 $B2 更改为 $B2:$B 时,我发现问题仅在 VLOOKUP 中。

我确定 VLOOKUP 可以与 ArrayFormula 一起使用,但我不明白我的公式哪里出错了!请帮我纠正我的 ArrayFormula。

Here is the editable sheet link

【问题讨论】:

  • 我已经在我的问题中提到了相同的公式。我明白了,我会说得更清楚。很抱歉浪费您的时间!
  • 您指的是我的哪个公式(您认为当以任何方式对行进行处理时,该公式不起作用)?

标签: google-sheets google-sheets-formula array-formulas


【解决方案1】:

如果我理解正确,您正在尝试根据 D 列日期对 B 列进行“排名”,使得日期按理论上的升序排列,因此如果您随机化数据集,每个条目的“排名”将保持不变并且不会根据您引入的随机性而改变。

因此正确的公式是:

={"fx"; INDEX(IFNA(VLOOKUP(B2:B&D2:D, 
 {INDEX(SORT({B2:B&D2:D, D2:D}, 2, 1),,1), 
 IFERROR(1/(1/COUNTIFS(
 INDEX(SORT(B2:D, 3, 1),,1), 
 INDEX(SORT(B2:D, 3, 1),,1), ROW(B2:B), "<="&ROW(B2:B))))}, 2, 0)))}

{"fx"; ...} 2 个表(标题和实际表)的数组,例如。 ;


需要更短的INDEX 或更长的ARRAYFORMULA(不管哪一个),因为我们正在处理一个数组


IFNA 用于在 VLOOKUP 找不到匹配项时从 VLOOKUP 函数中删除可能的 #N/A 错误


我们在虚拟表{} 中将VLOOKUP 联合B 和D 列B2:B&amp;D2:D 并返回第二个2 列,如果存在完全匹配0


我们的虚拟表{INDEX(SORT({B2:B&amp;D2:D, D2:D}, 2, 1),,1), ...} 我们VLOOKUP 是由彼此相邻的2 列构成的,例如。 ,


我们通过创建一个由 2 列 {B2:B&amp;D2:D, D2:D} 彼此相邻的数组来获得第一列,其中我们 SORT 这个数组按日期/第二列 2 升序排列 1 但我们需要的只是之后排序是第一列,所以我们使用INDEX 将所有行带到,, 和第一列1


现在让我们看看我们如何使用COUNTIFS 获得虚拟表的第二列,这将模仿“排名”


IFERROR(1/(1/ 用于从输出中删除所有零值(所有空行都将包含 0 作为“排名”)


COUNTIFS 下,我们放置了 2 对参数:“如果列等于列”和“如果行大于或等于下一行,则将其加 1”ROW(B2:B), "&lt;="&amp;ROW(B2:B))


对于“如果列等于列”,我们这样做了两次并使用范围B2:D 并按日期/第三列3 以升序排列1,其中我们再次只需要第一列,所以我们INDEX 它并返回所有行,, 和第一列1

使用此公式,您可以添加、删除或随机化数据集,并且您将始终为每一行获得正确的值


至于为什么你的公式不起作用...为了不让 vlookup 出现 #N/A 错误,你需要定义范围的最后一行,但结果不会像你期望的那样,因为公式不是适合这份工作的人。

如前所述,AF 不支持某些功能,例如 SUM,AND,OR,还有一些功能可以以不同的方式工作,例如 IFS 或有一些限制,例如 @987654363 @,GOOGLEFINANCE

【讨论】:

  • 非常感谢!这么详细的解释,意义重大!所以简而言之,我们可以说 AF 下的函数 SPLIT 没有按预期工作,这是导致我的情况出现意外结果的原因吗?
【解决方案2】:

我已在您的共享表格“我的实践”中的选项卡上回答了您,因此:

您无法像在单元格 CI2 中尝试那样拆分两列数组。这就是为什么你的公式不起作用的原因。您只能拆分 ONE 列数组。

我了解您正在努力学习,但恐怕尝试使用这样的复杂公式会使学习变得更加困难。

【讨论】:

  • 您好,感谢您宝贵的时间!但我认为你弄错了。我没有拆分两个列数组,它实际上只是一个(检查DK2)并且拆分有效(检查DL2)。我的公式也可以正常工作,因为您可以检查 CE2,唯一的问题是当我将 VLOOKUP 转换为 ARRAYFORMULA 时。
  • 我完全理解你,只是我想知道我哪里错了,因为我真的在这方面投入了大量的时间!
  • @AashitGarodia 你是对的。您可以将 RANK 添加到您的函数列表中,这些函数在数组公式中无法按照您希望的方式工作。 RANK() 函数的条件范围只能是单列或单行。它不能是您尝试的二维范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2021-05-21
  • 2022-09-27
相关资源
最近更新 更多