在一个封闭的工作簿SUMIF

我得到了以下工作公式:

={SUM(SUM.IF( 'Sheet1'!$B:$B; IF(INDEX(List;;MATCH($D$4;Month;0);2);INDEX(List;;1);0); 'Sheet1'!$H:$H ))} 

如果范围(Sheet1)实际上是在一个封闭的工作簿,我想使它工作。 我发现以下文章:

http://support.microsoft.com/kb/260415

我不知道从哪里开始工作,假设B:B和H:H在另一个工作簿中。

D4是当前月份,Month是12个月的列表,List由2个区域组成,第一个是我需要与B:B范围比较的唯一ID,第二个区域是12个布尔值列,告诉我是否我其实想要考虑所需月份的ID。

如果我只是使用Microsoft KB转换它,以下将无法工作(#N / A!错误,如果作为数组公式input,我只是得到工作表的总行数,如果我作为一个正常的公式input) :

 ={SUM(IF( '[myFile.xlsx]Sheet1'!$B:$B = IF(INDEX(List;;MATCH($D$4;Month;0);2);INDEX(List;;1);0); '[myFile.xlsx]Sheet1'!$H:$H; 0 ))} 

@barry houdini的回答后,这里是我有确切的公式(还有一点简化)。 第二个(他的答案)并不给我完全相同的数字,因为它将H列中B列为空的数字加起来(即使列表中没有任何空行)。

加工

 =SUM(SUMIF( 'April'!$B:$B; IF(INDEX(List;;4;2);INDEX(List;;1);0); 'April'!$H:$H )) 

几乎工作

 =SUM( IF( ISNUMBER( MATCH('April'!$B:$B;IF(INDEX(List;;4;2);INDEX(List;;1);0);0) ); 'April'!$H:$H )) 

你的问题是,Excel不知道如何比较整个列…

'[myFile.xlsx]Sheet1'!$B:$B

到一个不同大小的列表,即返回的

IF(INDEX(List;;MATCH($D$4;Month;0);2);INDEX(List;;1);0)

尝试使用MATCH来做到这一点,即

根据意见修改:

=SUM(IF('[myFile.xlsx]Sheet1'!$B:$B<>"",IF(ISNUMBER(MATCH('[myFile.xlsx]Sheet1'!$B:$B;IF(INDEX(List;;MATCH($D$4;Month;0);2);INDEX(List;;1);0);0));'[myFile.xlsx]Sheet1'!$H:$H)))

替代 …..(见注释),避免了额外的IF

=SUM(IF(ISNUMBER(MATCH('[myFile.xlsx]Sheet1'!$B:$B;IF(INDEX(List;;MATCH($D$4;Month;0);2);INDEX(List;;1);"");0));'[myFile.xlsx]Sheet1'!$H:$H))

CTRL + SHIFT + ENTER确认

MATCH返回一个数字(当有匹配的时候)或#N/A所以当你用ISNUMBER包装时,你会得到一个TRUE/FALSE值列表。

注意:使用整列B和H可能会很慢( SUMIF将只使用“使用范围”,这将使用整列),所以,如果可以,我build议使用更有限的范围

我猜这个列表和月份是closures的工作簿中命名的范围。 在这种情况下,您无法在已closures的工作簿中引用已命名的范围。 将ListMonth使用转换为closures的工作簿中的实际单元格引用。