如何使用带有OFFSET的ARRAYFORMULA到上一行而不出现循环引用错误

时间:2019-03-20 18:56:11

标签: google-sheets offset array-formulas circular-reference

示例工作表:https://docs.google.com/spreadsheets/d/14ma-y3esh1S_EkzHpFBvLb0GzDZZiDsSVXFktH3Rr_E/edit?usp=sharing

在ItemData表的B列中,通过将公式复制到列中的每个单元格中,我已经达到了想要的结果,但是我想使用ArrayFormula来解决这个问题。

在C列中,我使用ArrayFormula获得了相同的结果。但是,另外,C列是指B列中的单元格,而B列是指B列中的单元格。 B列中的每个单元格都向上一行的单元格加1。

如果我选择C3公式文本并将其粘贴到单元格B3的单元格编辑字段中(以免在复制过程中弄乱单元格引用-我知道我可以将它们设为静态引用,但这不是我的问题),则该单元格获取错误值

  

#REF!

     

错误   检测到循环依赖。要使用迭代计算进行求解,请参见“文件”>“电子表格设置”。

请注意,在两种情况下需要完成的加法操作都是相同的:将1添加到上一行的单元格的值,因此不涉及循环引用。在B2中提供了一个起始值,并且B3及以下的单元格应使用上一行中B单元格的数据。

另外,请注意,我确实尝试了File-> Spreadsheet设置并启用了最多25个项目的循环引用计算,但这仅填充了前两个单元格(B3和B4)。

如何解决此问题?我更喜欢ArrayFormula之类的东西,其中公式仅存在于单个单元格中。但是粘贴粘贴是可以接受的,只要任何新行插入到行之间或行底部,并在B列中添加相同的公式即可。

1 个答案:

答案 0 :(得分:1)

匹配项总是是连续的吗?因为您要在公式逻辑中将每个“项目”单元格与其上方的单元格进行比较,所以似乎是这样。这打破了电子表格规范化的[未写入?]规则;值的地址本身通常不应被视为数据。

但是,如果您对此有所承诺,是否考虑过将位置明确用作数据源?示例:

=ARRAYFORMULA(IFS(
  NOT(LEN(A3:A40)),,
  ROW(A3:A40)-3-MATCH(A3:A40,A$3:A$40,0)<=VLOOKUP(VLOOKUP(A3:A40,Items!$A$2:$D,2,false),DataPerColor!$A$2:$B,2,false),ROW(A3:A40)-3-MATCH(A3:A40,A$3:A$40,0),
  true,
))

就像您的公式一样,所有使用英语的内容是:

for each row,  
if there's no Item, don't output any ItemData,  
if the number that belongs in this cell¹ is less than or equal to the lookup, print it,  
otherwise, don't output any ItemData

但是¹“该单元格中的数字”是什么?不使用B列又如何计算呢?我滥用事物的位置来获取它。向下看B行,出现的每个数字都只是:

this row's number,  minus  
the row where items start [always 3],  minus  
the row number [in just the Item rows] of the first row containing this row's Item

倒数第二个ItemC 为例:第一个ItemC是第16个商品清单,而我们正在查找的那个商品…“倒数第二个ItemC”是在工作表的第21行中。 21-3-16 = 2…您想要的电话号码。

如果您能忍受,那是一个简单的配方,并且可以按照您的要求工作。