DATE和COLUMN功能无效的SUMPRODUCT - 为什么不呢?

时间:2015-04-17 08:14:10

标签: excel excel-formula

我遇到了SUMPRODUCT功能的问题。我找到了一个不太理想的工作,并希望看看有人能解释为什么我的理想公式不起作用。以下是我的电子表格的简化视图:

Excel Spreadsheet

第一张表tabCheckout是我检查过的书籍清单和数量(我真的喜欢随风而去)。 (没有公式)

第二个表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))

其中startDate = C5。我在单元格E6中尝试了它,它返回一个#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函数进行OFFSET。我从未见过Excel在一个单元格中返回有效值,但如果合并公式则不会。这就是我通常建立复杂公式的方式。

任何有关SUMPRODUCT组合的原因的帮助&gt;日期*&gt; COLUMN()不起作用将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先:我不确定这些公式的复杂性是否真的有必要。这就是为什么我的回答并不是这个问题的完整答案。但问题包含“为什么OFFSET在数组上下文中是否有效?”作为一部分。这部分问题的答案是:

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

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

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

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

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