最近在用Excel给自己的开销做帐,发现了一个不是很方便的地方,可能算是一个Bug,我用的Office版本是Office 2013。举个例子,假设下图这种情况
我要计算每一笔花销后的余额,使用公式的话,很自然地想到在单元格D3处写入公式:
=D2+B3-C3
如果后续添加新的消费,只要把单元格D3的公式拖拽填充到下一行就可以了。
但是如果我发现中间有一笔消费忘记录了,比如我在2017年10月2日有一笔消费,这时候我就需要在现在的第3行前面插入一行。我期待的是插入后单元格D4(即未插入新行前的D3)里的公式能够自动变为:
=D3+B4-C4
然而实际情况是:
插入新行后单元格D4的公式是
=D2+B4-C4
收入和支出列的引用正确地更改了,但对上一个余额列的引用并没有按我的要求改变。遇到这种情况一种方法是将单元格D4的公式修改正确后重新向下拖拽填充,但这多一步实在很麻烦。
这里对当前这笔消费后的余额计算其实是有规律的,就是取同一列上一行的值加上同一行向左两列的值减去同一行向左一列的值。既然Excel里不能自动更改好我想要的引用方式,能不能有一种方法能够表达处这种相对关系的引用,这样我就不需要依赖Excel的自动更改,中间插入多少行都没关系了。
经过查找后我得出了一个解决方案,就是将ROW()函数、COLUMN()函数、ADDRESS()函数和INDIRECT()函数组合起来。下面先对这四个函数进行简单的介绍:
ROW()函数
ROW()函数的调用格式为:
=ROW([reference])
其中reference是一个数据区域。ROW()函数会返回这个数据区域的首行行号。
例如
=ROW(A2:F7)
得到的值是2,因为这个数据区域的是从第2行开始的。
如果不给定reference,则返回公式所在单元格的行号。
COLUMN()函数
COLUMN()函数的调用格式:
=COLUMN([refrence])
和ROW()函数相对应的,COLUMN()函数返回的是列号,不过它返回值的是以数字形式表示的,而不是以Excel界面中A列、B列这种字母表示。
例如
=COLUMN(K4:M10)
得到的值是11,因为第K列是第