1

我有一个复杂的场景,我试图用 Excel 公式编写而不进入宏。

场景是我看到了一个日期范围,称为范围 A。即 2011 年 10 月 1 日 - 2011 年 5 月 4 日

我有一个包含 3 列的查找表;从日期,到日期,费率。该表包含大约 50 行,每行代表一个唯一的 3 个月期间(每年季度)和相应的费率。

我需要能够获取范围 A,找出每个季度有多少天,然后将这些天数乘以季度比率。

在示例 10/1/2011 - 5/4/2011 我应该以 81*2011_Q1_rate + 5*2011_Q2_rate 结束。

这很简单,有几个 for 循环和 VLOOKUP,但我需要避免使用宏。有没有人有任何其他建议?

谢谢,

斯科特。

4

1 回答 1

1

我将把这个分解成几部分,因为最后的方程很长。

我们必须做两件事,首先分开你的日期范围。我的范围在单元格F16中进行测试。这是通过使用你的to=MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1)数组来完成的。这两个匹配语句将为我们提供您的范围所在的第一季度和最后一个季度的行。使用这些行号,我们使用诸如创建引用。前面的公式将在我的测试用例中吐出。=MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1)A1C12From DateRateaddress()=ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2)$B$1:$B$9

第二部分是查找总数。我们将利用sumproduct(). 这是一个简单的sumproduct()公式:=SUMPRODUCT((B1:B7-A1:A7+1),C1:C7)。该范围现在只是静态的用于测试。它将以数组格式将季度结束减去季度开始,然后每个都加 1。这是因为1/31/13 - 1/1/13 = 30 days我们希望它是 31 天。然后将该数组乘以每个月的费率。

现在,当我们将它们拼凑在一起时,我们采用我们的第一个范围,使用indirect()并将我们的动态范围替换为简单的sumproduct()公式,最后以=SUMPRODUCT((INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),1))+1),INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3))).

现在该公式没有考虑部分月份。=((DATEVALUE(LEFT(F16,FIND(" - ",F16)))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)))*INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)))我们用and减去部分月份(从我们之前的方程中窃取),=((INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))))*INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))我们就完成了。

最终方程: =SUMPRODUCT((INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),1))+1),INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))-((DATEVALUE(LEFT(F16,FIND(" - ",F16)))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)))*INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)))-((INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))))*INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))

If you split the data range into two separate cells, it will make the equation much smaller and have a higher likelihood of working correctly since there is less room for error.

于 2013-01-31T00:52:18.987 回答