2015-04-17 41 views
0

我遇到了SUMPRODUCT函数的问题。我找到了一个不太理想的工作,并希望看到有人能够解释为什么我的理想配方不起作用。我的电子表格的下面被简化的观点:SUM产品的DATE和COLUMN功能不起作用 - 为什么不呢?

Excel Spreadsheet

第一个表tabCheckout是我已签出的图书清单和数量(我真的很喜欢飘)。 (没有公式)

第二张表tabBook是我的库存。 (无公式)

第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> DATE *> COLUMN()组合不起作用的任何帮助将不胜感激。

+0

为什么你想要替换C5的引用呢?当拖动到右侧时,DATE(thisYear,thisMonth,C5)部分自然会变成DATE(thisYear,thisMonth,D5),DATE(thisYear,thisMonth,E5)等等。那不是你想要的吗?如果不是,这部分应该用于连续公式? –

+0

拖动也会更新表格引用,但是您可以复制'C6'并将其粘贴到'D6:...',或者使用像'tabBooks [[Book]:[Book]]这样的丑陋绝对表格引用' – BrakNicku

+1

不确定你的复杂性,但是为什么'OFFSET'工作不同,无论是否在数组上下文中的答案如下。 'OFFSET'返回像X123一样的单元格引用。在正常情况下,该引用将按原样进行评估并返回此单元格的内容。在数组上下文中,返回的引用将被评估为'{X123}',因为'OFFSET'的volatile行为会导致#VALUE。我们必须使用'N()'函数来修复这个问题。 'SUMPRODUCT((tabCheckout [Checkout] <= DATE(thisYear,thisMonth,N(OFFSET(startDate,0,COLUMN() - COLUMN(startDate)))))* ...)' –

回答

1

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

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

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

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

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

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

相关问题