Excel实用技巧之自动记录数据输入的时间

今天介绍一个技巧,不用VBA,就可以自动记录输入的时间。这个技巧用到了Excel中的迭代计算

01

数据和效果

假设有一个表格,记录了每一份潜在客户的信息,我们需要记录客户是否完成缴费,

如果有客户完成了缴费,我们会在“费用”列中对应单元格手工输入金额,并且在“续费时间”列自动记录缴费的时间(假定,我们录入金额的时间就是客户完成 缴费的时间)。

如果客户缴费比较集中,就会导致比较忙乱,所以,我们希望输入金额后,能够在续费时间列中自动记录当前时间,就像下面的动图所显示的效果一样:

02

方法分析

使用VBA可以很容易完成这个工作。不过对于大部分同学来说,并不能自如的使用VBA,因此可以暂时排除这个方案。

所以,我们考虑使用函数。

记录当前的时间有一个函数:NOW()。这个函数的作用就是返回当前的时间:

我们可以在费用列中输入公式:=IF(D3<>"",NOW(),"")

这里我们使用了一个IF函数来判断:

  1. 如果D3不等于空(完成缴费),就使用NOW()函数返回当前时间

  2. 如果D3等于空(未缴费),就返回空

这样,只要我们在D3单元格中输入金额,就会自动记录当前时间。

这里要提醒一下,缺省情况下,这个公式所在的单元格只会显示时间,如果希望显示日期和时间,请将该单元格的格式设置为自定义格式:

这样,看似解决了问题。但是这个方法实际上并不能完成我们的需求:

如果你后续修改了其他的费用单元格(增加或者删除),所有人的续费时间都会显示为相同的时间值:

所以,此路不通!

03

一个很多人不了解甚至害怕的特性:循环引用和迭代计算

这里我们需要利用Excel的一个特别功能:迭代计算

大部分同学对这个特性很陌生。其实,有相当多的同学应该在不了解的情况下接触过特性了。例如,下面这个对话框,有些同学一定遇见过:

当你写了一个公式,回车确认输入后,也可能会弹出这个对话框。

这个对话框是说,你的单元格存在“循环引用”。什么是循环引用呢?简单说,就是一个单元格引用了自身。比如在A2中输入公式:=A2。当然,你一般不会犯这种错误,所以最简单的循环引用的场景是经过两次公式引用到自己:

在A2单元格中输入公式:=B2,然后在B2单元格中输入公式:=A2,这样从A2的角度看就是:A2--->B2---A2,就必然会出现这个对话框。

真正的循环引用有可能很复杂,比如B引用A,C引用B,D引用C,E引用D,然后A引用D,此时引用链是这样的:A--->B--->C--->D--->E---A。这个引用链越长,你就越难从公式中发现谁引用了谁,何况有些公式还很复杂。此时,需要用到一个工具:错误检查。

在公式选项卡中,可以找到这个工具:

Excel会将循环引用的链条用蓝色箭头线标识出来。

那么,发生了循环引用怎么办?

循环引用往往是个错误,是我们手误造成的。一旦发生,需要仔细检查公式,然后修改。如果公式比较长,需要花比较长的时间进行检查,还不一定检查的出来。有时,可以将所有相关公式删除掉,然后重新输入公式。

但是,有的时候,我们需要这个循环引用。这时,我们实际上需要的是迭代计算。

所谓迭代计算,是说我们用同样的规则,连续执行N次。举个例子来说:

假设我们把B2当作一个未知数,计算规则(即公式)是:=B2+1

执行一百次(N=100)

初始值B2:=0(因为此时B2是空的)

第1次:0+1=1

第2次:1+1=2

第3次:2+1=3

第4次:3+1=4

......

第N次:N-1+1=N

我们来看一个实际的例子:

假设在B3单元格中输入公式:=B2+1,

结果只会是1,因为B2单元格没有变化,没有任何迭代。要想迭代,我们需要将公式计算结果返回到B2中,然后才能往下多次计算。

因此,我们需要在B2中输入公式:=B2+1

此时,B2结果为0。这是因为此时发生了循环引用(B2--->B2),所以根本没有计算。

要想实现这个迭代过程,你需要在Excel中激活迭代计算。

点击文件选项卡,然后点击选项:

在选项对话框中,左边选择“公式”,右边勾选“启用迭代计算”:

注意,缺省的迭代次数是100,精度是0.0001。这两个值决定迭代什么时候终止。

所有的迭代必须有终止条件,否则Excel就会陷入死循环。这里有两个终止条件:一个是迭代次数,缺省情况下,最多迭代100次。精度是另一个终止条件,当本次的计算结果跟上一次的计算结果相差小于等于精度时,迭代就会终止。

你可以试试将迭代次数设一个很大的数试试(比如100万)😉。

点击确定后,返回Excel:

此时,B2单元格的值变成了100。

这是因为,B2中的公式:=B2+1发生了100次迭代计算。

04

自动记录时间

现在我们利用这个特性,实现自动记录输入输入时间。

在续费时间列中,输入公式:=IF(D3="","",IF(E3<>"",E3,NOW()))

这个公式仍然是通过最外面IF公式判断D3,根据D3的值,决定是显示时间还是空值。这个最外面的IF很简单,重点是内层的IF公式:IF(E3<>"",E3,NOW())

这个公式根据E3进行判断:

  1. 如果E3不为空值,返回E3。注意这时已经发生了迭代,只不过根据精度条件,一次就终止了)

  2. 如果E3空值,返回NOW(),即当前时间

这样,比如D3中输入费用时,会发生以下情况:

  1. 如果E3原来为空,那么就会返回当前时间。这是一个客户完成缴费后正常发生的情形

  2. 此时E列其他单元格有两种情况,要么为空,要么已经记录了时间。如果已经记录了时间,根据内层的IF公式,这个值不变。如果没有记录时间,说明对应的费用列是空的,也就不会有值。所以不会发生所以时间都变为当前时间的情况。

总结

本文介绍的这个技巧是一个非常有用的技巧。因为有了迭代计算,使我们不用编程就可以完成很多原来必须依靠编程或者复杂的表格设计才能实现的结果。

这里的公式实际上很简单。不过是这个迭代计算需要花点心思去理解一下。一旦你理解了这个技巧,在很多场景中都可以利用它简化表格设计,甚至实现原来实现不了的功能。后面我会为大家介绍使用这个技巧的其他的应用场景。

赶紧用起来吧!

(0)

相关推荐