Excel和长公式

VBA是非常有用的东西。 您可以合并来自许多文件的数据,并使用有趣的算法处理大量信息。 例如, Nodupes宏 。 它使用代码执行期间发生的错误作为检查所生成集合中是否存在元素的检查。 有些宏使用递归来形成所有可能的组合和排列。

但我想展示一些使用标准Excel工作表功能的示例。 通常,您必须从公式中隔离花园,以便从单元格中提取所需的文本或数字。 这通常是由于数据显示不正确造成的。 数字是数字,文本是文本,请勿混用。 日期(和时间)是可以用来进行计算的数字。 不要将2018年3月14日与2018年3月14日混淆。第二个只是自定义日期格式[$ -F800],我们在单元格中看到的,在公式栏上将是2018年3月14日。 足够了。

1.假设您有一个表,其中包含某些事件的开始和结束时间,例如电话对话。


在图片中,表_t2的一部分。 有必要计算最大同时发生的事件数。 为此,有一个公式:

=(((_t2[start]>=(_t2[start]))*(_t2[start]<=(_t2[end]));(_t2[start])^0))     =MAX(MMULT((_t2[start]>=TRANSPOSE(_t2[start]))*(_t2[start]<=TRANSPOSE(_t2[end])),ROW(_t2[start])^0)) 

公式很大,同时按下Control,Shift,Enter(CSE)按钮可以确认输入。 编辑栏将显示该公式用大括号显示。 MUMNOZH将虚拟矩阵的大小乘以表的行数乘以表的行数,并在表的行数中输入计算结果,就好像在表的行中输入了以下公式(对于第二行)= SUMPRODUCT(F(((C $ 2:C2> A2))))/ = SUMPRODUCT(N((C $ 2:C2> A2))),然后扩展到整个表。

2.一样,但是更复杂。 除了开始和结束之外,还有给定/接收的单位数或功率。 有必要在某个时间点确定最大功率。

表_t1的一部分:


和公式本身:

 =((((_t1[start]*1440)<=(1:1436)-1)*((_t1[stop]*1440)>=(1:1436)-1);_t1[power])) =MAX(MMULT((TRANSPOSE(_t1[start]*1440)<=ROW(1:1436)-1)*(TRANSPOSE(_t1[stop]*1440)>=ROW(1:1436)-1),_t1[power])) 

由于时间是单位的分数,因此我们将值乘以一天中的分钟数即可得到整数。 第二个参数是MULTIPLE-一列幂值。 在第一种情况下,将生成一个单位栏。

3.表格左侧是与某些时间间隔相对应的金额。 必须计算每月金额。 假定量在其间隔内均匀分布。


H列是每月的第一天,I列包含以下公式:

 =(_tis[sum per day]*((((H3;0)>_tis[end];_tis[end];(H3;0))-(H3>_tis[start];H3;_tis[start])+1)^0,5;)^2) =SUM(_tis[sum per day]*IFERROR((IF(EOMONTH(H3,0)>_tis[end],_tis[end],EOMONTH(H3,0))-IF(H3>_tis[start],H3,_tis[start])+1)^0.5,)^2) 

公式很大。 您可以使用SUMPRODUCT / SUMPRODUCT,但如果没有大量输入,则IF ERROR无效。 同样,不幸的是,MAX和MIN无法形成值的虚拟数组。 因此,IF用于计算每月间隔的一部分。 由于结果部分可能为负数,因此会人为地导致错误(负数的平方根会导致错误)。 在源表中,可以省去间隔持续时间和每日金额的列。 公式会更长一点。

4.一点乐趣。 一年可以有几个快乐的星期五?


星期五数:

 =(((((A:A;B2):(A:A;C2)))=13)*((((A:A;B2):(A:A;C2));2)=5)) =SUMPRODUCT((DAY(ROW(INDEX(A:A,B2):INDEX(A:A,C2)))=13)*(WEEKDAY(ROW(INDEX(A:A,B2):INDEX(A:A,C2)),2)=5)) 

星期五日期:

 =((15;6;(($A:$A;$B2):($A:$A;$C2))/(((($A:$A;$B2):(A:A;$C2)))=13)/(((($A:$A;$B2):($A:$A;$C2));2)=5);(A$2));"") =IFERROR(AGGREGATE(15,6,ROW(INDEX($A:$A,$B2):INDEX($A:$A,$C2))/(DAY(ROW(INDEX($A:$A,$B2):INDEX(A:A,$C2)))=13)/(WEEKDAY(ROW(INDEX($A:$A,$B2):INDEX($A:$A,$C2)),2)=5),COLUMN(A$2)),"") 

很好(在这里)工作表的第一行对应于01/01/1901。 因此,很容易使用INDEX和STRING形成一年中的日期数组,并且只计算星期五的十三号。

5.利率大小取决于金额,这很普遍。 如果您使用它们的方式不正确,那么收到金额的时间表将如下图所示:


为避免这种情况,您只需要将费率应用于每个间隔的部分金额。 对于较低的时间间隔,采取固定量。

对于此类源数据:


配方

 =(A3;tbl;2)*(A3-(A3;tbl;1))+(((tbl[limit]<=A3)*(tbl[limit]-(tbl[limit];-1;))*(tbl[rate];-1;);)) =VLOOKUP(A3,tbl,2)*(A3-VLOOKUP(A3,tbl,1))+SUMPRODUCT(IFERROR((tbl[limit]<=A3)*(tbl[limit]-OFFSET(tbl[limit],-1,))*OFFSET(tbl[rate],-1,),)) 

公式很大。 在A3中,要计算其利息的金额。 初始数据–tbl。
最后,是可变利率的信贷额度。 用于计算利息金额的公式,具体取决于日期/付款/回报金额。

信用记录:


更改出价:


 =(B1=0;(((_d;_s[[date]:[rate]]);)*(B5:B16)*((_d>(A5:A16))*(_d<=A2);;)*1/(365+(((_d);4)=0)))-(((_d;_s[[date]:[rate]]);)*(D5:D16)*((_d>(C5:C16))*(_d<=A2);;)*1/(365+(((_d);4)=0)));) =IF(B1=0,SUM(IFERROR(LOOKUP(_d,_s[[date]:[rate]]),)*TRANSPOSE(B5:B16)*INDEX((_d>TRANSPOSE(A5:A16))*(_d<=A2),,)*1/(365+(MOD(YEAR(_d),4)=0)))-SUM(IFERROR(LOOKUP(_d,_s[[date]:[rate]]),)*TRANSPOSE(D5:D16)*INDEX((_d>TRANSPOSE(C5:C16))*(_d<=A2),,)*1/(365+(MOD(YEAR(_d),4)=0))),) 

公式很大。 按天计算利息,并考虑leap年。

感谢您的关注!

Source: https://habr.com/ru/post/zh-CN412103/


All Articles