我遇到了SUMPRODUCT功能的问题。我找到了一个不太理想的工作,并希望看看有人能解释为什么我的理想公式不起作用。以下是我的电子表格的简化视图:
第一张表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()不起作用将不胜感激。
答案 0 :(得分:1)
首先:我不确定这些公式的复杂性是否真的有必要。这就是为什么我的回答并不是这个问题的完整答案。但问题包含“为什么OFFSET
在数组上下文中是否有效?”作为一部分。这部分问题的答案是:
SUMPRODUCT
在数组上下文中获取所有参数。也就是说,它们将被评估为好像它们在数组公式中。
OFFSET
和INDIRECT
有不稳定的行为。也就是说,工作表的所有更改(不仅仅是OFFSET
和INDIRECT
的参数更改)都会导致重新计算OFFSET
和INDIRECT
公式。在数组上下文中,这种行为会导致一种无限循环,导致#VALUE
错误,除非我们通过使用OFFSET
和INDIRECT
的结果作为非易失性的参数来停止功能
换句话说:
OFFSET
会返回X123
之类的单元格引用。在正常情况下,将按原样评估此引用,并返回此单元格的内容。在数组上下文中,返回的引用将被评估为{X123}
,因为#VALUE
的易变行为导致OFFSET
。我们必须使用OFFSET
的结果作为非易失性函数的参数来修复它。在这种情况下,N()
函数会提供,因为我们需要来自OFFSET
的数字。
...SUMPRODUCT((tabCheckout[Checkout]<=DATE(thisYear,thisMonth,N(OFFSET(startDate,0,COLUMN()-COLUMN(startDate)))))*...)
在其他情况下,可能必须使用T()
,因为我们需要文本。