今天介紹一個(gè)技巧,不用VBA,就可以自動(dòng)記錄輸入的時(shí)間。這個(gè)技巧用到了Excel中的迭代計(jì)算
01
數(shù)據(jù)和效果
假設(shè)有一個(gè)表格,記錄了每一份潛在客戶的信息,我們需要記錄客戶是否完成繳費(fèi),
如果有客戶完成了繳費(fèi),我們會(huì)在“費(fèi)用”列中對(duì)應(yīng)單元格手工輸入金額,并且在“續(xù)費(fèi)時(shí)間”列自動(dòng)記錄繳費(fèi)的時(shí)間(假定,我們錄入金額的時(shí)間就是客戶完成 繳費(fèi)的時(shí)間)。
如果客戶繳費(fèi)比較集中,就會(huì)導(dǎo)致比較忙亂,所以,我們希望輸入金額后,能夠在續(xù)費(fèi)時(shí)間列中自動(dòng)記錄當(dāng)前時(shí)間,就像下面的動(dòng)圖所顯示的效果一樣:
02
方法分析
使用VBA可以很容易完成這個(gè)工作。不過(guò)對(duì)于大部分同學(xué)來(lái)說(shuō),并不能自如的使用VBA,因此可以暫時(shí)排除這個(gè)方案。
所以,我們考慮使用函數(shù)。
記錄當(dāng)前的時(shí)間有一個(gè)函數(shù):NOW()。這個(gè)函數(shù)的作用就是返回當(dāng)前的時(shí)間:
我們可以在費(fèi)用列中輸入公式:=IF(D3"",NOW(),"")
這里我們使用了一個(gè)IF函數(shù)來(lái)判斷:
如果D3不等于空(完成繳費(fèi)),就使用NOW()函數(shù)返回當(dāng)前時(shí)間
如果D3等于空(未繳費(fèi)),就返回空
這樣,只要我們?cè)贒3單元格中輸入金額,就會(huì)自動(dòng)記錄當(dāng)前時(shí)間。
這里要提醒一下,缺省情況下,這個(gè)公式所在的單元格只會(huì)顯示時(shí)間,如果希望顯示日期和時(shí)間,請(qǐng)將該單元格的格式設(shè)置為自定義格式:
這樣,看似解決了問(wèn)題。但是這個(gè)方法實(shí)際上并不能完成我們的需求:
如果你后續(xù)修改了其他的費(fèi)用單元格(增加或者刪除),所有人的續(xù)費(fèi)時(shí)間都會(huì)顯示為相同的時(shí)間值:
所以,此路不通!
03
一個(gè)很多人不了解甚至害怕的特性:循環(huán)引用和迭代計(jì)算
這里我們需要利用Excel的一個(gè)特別功能:迭代計(jì)算
大部分同學(xué)對(duì)這個(gè)特性很陌生。其實(shí),有相當(dāng)多的同學(xué)應(yīng)該在不了解的情況下接觸過(guò)特性了。例如,下面這個(gè)對(duì)話框,有些同學(xué)一定遇見(jiàn)過(guò):
當(dāng)你寫(xiě)了一個(gè)公式,回車(chē)確認(rèn)輸入后,也可能會(huì)彈出這個(gè)對(duì)話框。
這個(gè)對(duì)話框是說(shuō),你的單元格存在“循環(huán)引用”。什么是循環(huán)引用呢?簡(jiǎn)單說(shuō),就是一個(gè)單元格引用了自身。比如在A2中輸入公式:=A2。當(dāng)然,你一般不會(huì)犯這種錯(cuò)誤,所以最簡(jiǎn)單的循環(huán)引用的場(chǎng)景是經(jīng)過(guò)兩次公式引用到自己:
在A2單元格中輸入公式:=B2,然后在B2單元格中輸入公式:=A2,這樣從A2的角度看就是:A2--->B2---A2,就必然會(huì)出現(xiàn)這個(gè)對(duì)話框。
真正的循環(huán)引用有可能很復(fù)雜,比如B引用A,C引用B,D引用C,E引用D,然后A引用D,此時(shí)引用鏈?zhǔn)沁@樣的:A--->B--->C--->D--->E---A。這個(gè)引用鏈越長(zhǎng),你就越難從公式中發(fā)現(xiàn)誰(shuí)引用了誰(shuí),何況有些公式還很復(fù)雜。此時(shí),需要用到一個(gè)工具:錯(cuò)誤檢查。
在公式選項(xiàng)卡中,可以找到這個(gè)工具:
Excel會(huì)將循環(huán)引用的鏈條用藍(lán)色箭頭線標(biāo)識(shí)出來(lái)。
那么,發(fā)生了循環(huán)引用怎么辦?
循環(huán)引用往往是個(gè)錯(cuò)誤,是我們手誤造成的。一旦發(fā)生,需要仔細(xì)檢查公式,然后修改。如果公式比較長(zhǎng),需要花比較長(zhǎng)的時(shí)間進(jìn)行檢查,還不一定檢查的出來(lái)。有時(shí),可以將所有相關(guān)公式刪除掉,然后重新輸入公式。
但是,有的時(shí)候,我們需要這個(gè)循環(huán)引用。這時(shí),我們實(shí)際上需要的是迭代計(jì)算。
所謂迭代計(jì)算vba 在表格中記錄時(shí)間,是說(shuō)我們用同樣的規(guī)則,連續(xù)執(zhí)行N次。舉個(gè)例子來(lái)說(shuō):
假設(shè)我們把B2當(dāng)作一個(gè)未知數(shù),計(jì)算規(guī)則(即公式)是:=B2+1
執(zhí)行一百次(N=100)
初始值B2:=0(因?yàn)榇藭r(shí)B2是空的)
第1次:0+1=1
第2次:1+1=2
第3次:2+1=3
第4次:3+1=4
......
第N次:N-1+1=N
我們來(lái)看一個(gè)實(shí)際的例子:
假設(shè)在B3單元格中輸入公式:=B2+1,
結(jié)果只會(huì)是1,因?yàn)锽2單元格沒(méi)有變化,沒(méi)有任何迭代。要想迭代,我們需要將公式計(jì)算結(jié)果返回到B2中,然后才能往下多次計(jì)算。
因此,我們需要在B2中輸入公式:=B2+1
此時(shí),B2結(jié)果為0。這是因?yàn)榇藭r(shí)發(fā)生了循環(huán)引用(B2--->B2),所以根本沒(méi)有計(jì)算。
要想實(shí)現(xiàn)這個(gè)迭代過(guò)程,你需要在Excel中激活迭代計(jì)算。
點(diǎn)擊文件選項(xiàng)卡,然后點(diǎn)擊選項(xiàng):
在選項(xiàng)對(duì)話框中,左邊選擇“公式”,右邊勾選“啟用迭代計(jì)算”:
注意,缺省的迭代次數(shù)是100,精度是0.0001。這兩個(gè)值決定迭代什么時(shí)候終止。
所有的迭代必須有終止條件,否則Excel就會(huì)陷入死循環(huán)。這里有兩個(gè)終止條件:一個(gè)是迭代次數(shù),缺省情況下,最多迭代100次。精度是另一個(gè)終止條件,當(dāng)本次的計(jì)算結(jié)果跟上一次的計(jì)算結(jié)果相差小于等于精度時(shí),迭代就會(huì)終止。
你可以試試將迭代次數(shù)設(shè)一個(gè)很大的數(shù)試試(比如100萬(wàn))。
點(diǎn)擊確定后,返回Excel:
此時(shí),B2單元格的值變成了100。
這是因?yàn)椋珺2中的公式:=B2+1發(fā)生了100次迭代計(jì)算。
04
自動(dòng)記錄時(shí)間
現(xiàn)在我們利用這個(gè)特性,實(shí)現(xiàn)自動(dòng)記錄輸入輸入時(shí)間。
在續(xù)費(fèi)時(shí)間列中,輸入公式:=IF(D3="","",IF(E3"",E3,NOW()))
這個(gè)公式仍然是通過(guò)最外面IF公式判斷D3,根據(jù)D3的值,決定是顯示時(shí)間還是空值。這個(gè)最外面的IF很簡(jiǎn)單vba 在表格中記錄時(shí)間,重點(diǎn)是內(nèi)層的IF公式:IF(E3"",E3,NOW())
這個(gè)公式根據(jù)E3進(jìn)行判斷:
如果E3不為空值,返回E3。注意這時(shí)已經(jīng)發(fā)生了迭代,只不過(guò)根據(jù)精度條件,一次就終止了)
如果E3空值,返回NOW(),即當(dāng)前時(shí)間
這樣,比如D3中輸入費(fèi)用時(shí),會(huì)發(fā)生以下情況:
如果E3原來(lái)為空,那么就會(huì)返回當(dāng)前時(shí)間。這是一個(gè)客戶完成繳費(fèi)后正常發(fā)生的情形
此時(shí)E列其他單元格有兩種情況,要么為空,要么已經(jīng)記錄了時(shí)間。如果已經(jīng)記錄了時(shí)間,根據(jù)內(nèi)層的IF公式,這個(gè)值不變。如果沒(méi)有記錄時(shí)間,說(shuō)明對(duì)應(yīng)的費(fèi)用列是空的,也就不會(huì)有值。所以不會(huì)發(fā)生所以時(shí)間都變?yōu)楫?dāng)前時(shí)間的情況。
總結(jié)
本文介紹的這個(gè)技巧是一個(gè)非常有用的技巧。因?yàn)橛辛说?jì)算,使我們不用編程就可以完成很多原來(lái)必須依靠編程或者復(fù)雜的表格設(shè)計(jì)才能實(shí)現(xiàn)的結(jié)果。
這里的公式實(shí)際上很簡(jiǎn)單。不過(guò)是這個(gè)迭代計(jì)算需要花點(diǎn)心思去理解一下。一旦你理解了這個(gè)技巧,在很多場(chǎng)景中都可以利用它簡(jiǎn)化表格設(shè)計(jì),甚至實(shí)現(xiàn)原來(lái)實(shí)現(xiàn)不了的功能。后面我會(huì)為大家介紹使用這個(gè)技巧的其他的應(yīng)用場(chǎng)景。
趕緊用起來(lái)吧!