今天一位学员问的一个问题:

如上图,在C列中计算累计付费,计算要求是:C2=B2*AG2,C3=B3*AF3,……,即累计费用=B列的值*本行最后一个数字。
怎么解决这个问题呢?
很多同学不愿意系统化学习下常用的函数,导致遇到问题时不能把掌握的函数融汇贯通。
下面分享下我写的9个公式,希望能启发大家的思路。
一、B列的引用列是固定的,最主要的是确定每一行最后一个数字的位置,所以我们想办法得到这个位置,然后引用此位置的数字即可。
1、=B2*INDIRECT(ADDRESS(ROW(),35-ROW()))

每行最后一个数字所在位置行号好确定,列号从33逐渐往回退,所以想到用35-ROW()来确定列号,知道行号、列号即可返回地址,把文本型地址转化为引用用INDIRECT函数。
2、=B2*INDEX(D2:AG2,1,32-ROW())

从每一行返回最后一个位置上对应的数字,所以只要确定最后一个位置的列号即可。
3、=B2*INDEX(D2:AG2,1,COUNT(D2:AG2))

确定每行最后一个位置的列号可以通过计算数字的个数得出。
4、=B2*OFFSET($C$1,ROW()-1,32-ROW())

同3,只不过返回每行最后一个数字一个用了INDEX,一个用了OFFSET。
5、=B2*OFFSET(AG1,1,2-ROW())

思路同上,只是用了相对位置简化了OFFSET中的第二个参数,当然你还可以简化成如下:

二、求每行最后一个值,可以不用找到其位置,通过别的手段实现。
6、=B2*LOOKUP(10^5,C2:AG2)

LOOKUP(10^5,C2:AG2),LOOKUP可以查找某行、某列中的最后一个数字或文本。
7、=B2*SUMIF(D3:AG3,"",D2:AG2)

通过观察数据的结构能够发现下一行第一个空值对应的上一行的数据就是我们需要的数据。
8、=B2*SUMPRODUCT((D3:AG3="")*D2:AG2)

与6相似,只不过用了数组的思维。
9、=myf(B2,AH2)

这是什么玩意?
这是我自定义的函数,代码如下:

有时候VBA就是比函数还简单,不是骗你学习VBA哦,是如果工作需要的话,学点VBA绝对有好处。
)