具有 DATE 和 COLUMN 函数的 SUM PRODUCT 不起作用 - 为什么不呢?

SUM PRODUCT with DATE and COLUMN functions not working - Why not?

我在使用 SUMPRODUCT 函数时遇到问题。我发现了一个不太理想的解决方法,想看看是否有人可以解释为什么我的理想公式不起作用。下面是我的电子表格的简化视图:

第一个tabletabCheckout是我借过的书的列表和数量(我很喜欢乱世佳人)。 (无公式)

第二个table tabBooks 是我的库存。 (无公式)

第 5 行是 1-31 月的第几天(无公式)

第6行是出现问题的地方。它应该向我显示该月每一天的可用数量。

下面是在单元格 C6 中运行良好的公式:

=INDEX(tabBooks,MATCH($B6,tabBooks[Book],0),2)-SUMPRODUCT((tabCheckout[Checkout]<=DATE(thisYear,thisMonth,C5))*(tabCheckout[Checkin]>=DATE(thisYear,thisMonth,C5+1))*(tabCheckout[Book]=$B6)*(tabCheckout[Qty]))

我的目标是将公式中对 C5 的引用替换为:

OFFSET(startDate,0,COLUMN()-COLUMN(startDate))

其中开始日期 = C5。我在单元格 E6 中尝试过,它 return 是一个 #VALUE!错误(被 IFERROR 隐藏)。我取出了整个 DATE 函数并将其放在单元格 E7 中,它工作正常。

E6 单元格公式:

=INDEX(tabBooks,MATCH($B6,tabBooks[Book],0),2)-SUMPRODUCT((tabCheckout[Checkout]<=DATE(thisYear,thisMonth,OFFSET(startDate,0,COLUMN()-COLUMN(startDate))))*(tabCheckout[Checkin]>=DATE(thisYear,thisMonth,E5+1))*(tabCheckout[Book]=$B6)*(tabCheckout[Qty]))

E7 单元格公式:

=DATE(thisYear,thisMonth,OFFSET(startDate,0,COLUMN()-COLUMN(startDate)))

我没有使用 OFFSET 函数,而是绝望地在单元格 G6 中尝试了 INDIRECT 函数:

=IFERROR(INDEX(tabBooks,MATCH($B6,tabBooks[Book],0),2)-SUMPRODUCT((tabCheckout[Checkout]<=DATE(thisYear,thisMonth,INDIRECT("F" & COLUMN()-COLUMN(startDate)+1)))*(tabCheckout[Checkin]>=DATE(thisYear,thisMonth,G5+1))*(tabCheckout[Book]=$B6)*(tabCheckout[Qty])),"")

我真的非常绝望并尝试了 DATEVALUE 函数:

=IFERROR(INDEX(tabBooks,MATCH($B6,tabBooks[Book],0),2)-SUMPRODUCT((tabCheckout[Checkout]<=DATEVALUE(thisMonth & "/" & OFFSET(startDate,0, COLUMN()-COLUMN(startDate),1,1) & "/" & thisYear))*(tabCheckout[Checkin]>=DATE(thisYear,thisMonth,J5+1))*(tabCheckout[Book]=$B6)*(tabCheckout[Qty])),"")

SUMPRODUCT 函数与任何使用某种形式的 COLUMN() 或 ROW() 的 DATE* 函数结合使用似乎不起作用。在我的真实电子表格中,每周都从一个命名范围开始,然后我想使用 COLUMN 函数来抵消该范围。我从未在一个单元格中看到 Excel return 有效值,但如果合并公式则不会。这就是我通常建立复杂公式的方式。

任何关于 SUMPRODUCT > DATE* > COLUMN() 的组合为什么不起作用的帮助将不胜感激。

首先:我不确定这些公式的复杂性是否真的有必要。这就是为什么我的回答并不是这个问题的真正完整答案。但是问题包含问题 "Why OFFSET works different whether in array context or not?" 作为一部分。这部分问题的答案是:

SUMPRODUCT 在数组上下文中获取所有参数。也就是说,它们将被评估为就好像它们在数组公式中一样。

OFFSETINDIRECT 具有不稳定的行为。也就是说,工作表的所有更改,不仅是 OFFSETINDIRECT 参数的更改,都会导致重新计算 OFFSETINDIRECT 公式。在数组上下文中,这种行为会导致一种无限循环,从而导致 #VALUE 错误,除非我们通过使用 OFFSETINDIRECT 的结果作为非易失性参数的参数来停止这种情况功能。

换句话说: OFFSET returns 像 X123 这样的单元格引用。在正常上下文中,将按原样评估此引用,并且 returns 此单元格的内容。在数组上下文中,返回的引用将被计算为 {X123},由于 OFFSET 的易变行为导致 #VALUE。我们必须使用 OFFSET 的结果作为非易失性函数的参数来修复它。在这种情况下,N() 函数提供,因为我们需要来自 OFFSET.

的数字
...SUMPRODUCT((tabCheckout[Checkout]<=DATE(thisYear,thisMonth,N(OFFSET(startDate,0‌​,COLUMN()-COLUMN(startDate)))))*...)

在其他情况下,可能必须使用 T(),因为我们需要文本。