使用sumproduct进行Excel 2013高级日期范围查找

时间:2014-11-24 10:07:24

标签: excel date

我是Stackoverflow的新手,所以如果没有足够的信息,请告诉我。我过去使用过StackOverflow有很多有用的见解,但我在网上找不到任何有用的帖子,所以我希望你能帮到我。

我一直在研究excel(2013)问题。我正在努力建立一个营销议程来存储和跟踪我们的邮件活动。广告系列本身是通过其他系统发送的,但我们错过了提前规划邮件广告系列的能力。由于我们活跃在欧洲的不同市场,我们决定为所有地区提供一般邮件和特定地区的邮寄活动(两者都在同一议程中)。除此之外,我们还希望显示邮件焦点(不同的品牌)。我的想法是尽可能地将其返回(使其可用于所有用户)。我添加了一张小图片来显示我想要的最终结果(但此时没有任何数据)。

此时,用户将使用(Google)表单输入广告系列信息,并将此数据下载到工作表中(通过这样做,所有用户都可以添加新广告系列,并且每个人都可以访问最新的广告系列数据)。这部分效果很好。

我正在使用帮助工作表检查日期是否属于广告系列范围,如果它确实属于广告系列范围,则应返回邮寄ID(也是行号)。我有另一种形式,它使用这些数据来搜索正确的品牌并直观地显示(有很多条件格式)。

问题出现在帮助表中(当我检查日期是否属于活动范围时)。我已经能够使用以下公式(或多或少)使其工作:

=IF(SUMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper!$D$2:$D$100>=$B4);RIJ(CountryHelper!$C$2:$C$100))=0;"";INDEX(CountryHelper!$A$2:$A$100;SOMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100))))

在此公式中,CountryHelper!C:C引用了邮件活动的StartDate。 D:D将引用EndDates的列,A:A具有邮件ID。单元格B4是需要检查的日期。

起初它看起来很完美。如果日期落在日期范围内,那么它将返回ID。稍微玩了一下这个问题就出现了。它只适用于非重叠日期,一旦日期重叠excel将行号加在一起,它将不再起作用。

是否可以使sumproduct公式工作并仅返回第一个ID。我知道我必须再制作另外两个返回第二个和第三个ID的公式(我确信我们不会超过3个重叠日期)。这也是我迷路的部分。我尝试使用以下sumproduct公式的MIN和MAX变体:

=SUMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper_RSEU!$D$1:$D$100>=$B4);ROW(CountryHelper!$C$1:$C$100))

这将返回0(带MIN)或100(带MAX)。我认为这是由公式引起的(现在它只搜索前99行)。我也冒险进入VBA / UDF来完成这项工作,但据我所知,这是不可能的。

无论如何,我很抱歉这个长篇故事,我希望我的问题很明确,你可以帮助我。如果您需要更多信息。

谢谢!

empty Marketing Agenda overview

1 个答案:

答案 0 :(得分:1)

SUMPRODUCT是一种瑞士军刀Excel功能。但这里错了,因为正如你已经看到的那样,它最终会计算出一个SUM。它大部分都有效,因为它首先将0或1条件与行数相乘,因此只有满足条件的行数才会进入总和。但如果两个或多个行号满足条件,则将它们加在一起。

您熟悉数组公式吗?以下数组公式应该是您想要的:

{=INDEX(CountryHelper!$A$2:$A$100;MIN(IF((CountryHelper!$C$2:$C$100<=$B4)*(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100)-1)))}

要创建数组公式,请将公式放入不带花括号的单元格中,然后按[Ctrl] + [Shift] + [Enter]。然后大括号应该自动出现。

工作原理:

{IF((CountryHelper!$C$2:$C$100<=$B4)*(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100)-1)}

获取行号数组或FALSE {FALSE,rowNumber,FALSE,...}。如果两个条件都满足,那么它得到行号-1,如果没有,那么它得到FALSE。 然后MIN函数从此数组中获取最小值(行号-1)。 然后INDEX表示满足条件的最小(行号-1)。

它从行号中减去1,因为您的INDEX范围从第2行开始。如果第2行满足条件,则它是此范围内的索引1,如果第3行符合条件,则为索引2等等。

为什么它只能用作数组公式?因为即使IF&#34; Value_if_true&#34;是一个范围。在数组上下文中,它确实如此。