DoEvents在循環(huán)結(jié)構(gòu)中的技巧
--------------------------------------------------------------------------------
通常是將DoEvents加在循環(huán)結(jié)構(gòu)中,以便于在運(yùn)行循環(huán)的同時可以進(jìn)行其他操作。舉個例子:
例如我們需要求1+2+3+4+...+10000的值,我們可以寫一個Sub如下
Sub MySub()
[a1] = 0
For i = 1 To 10000
[a1] = [a1] + i
Next
End Sub
這段代碼肯定沒有問題,絕對準(zhǔn)確。不過在我們運(yùn)行這段代碼的時候,我們發(fā)現(xiàn):
1、鼠標(biāo)指針變成了忙碌狀態(tài)
2、在運(yùn)行的過程中不能移動Excel窗口或者在Excel中進(jìn)行其他操作,也就是Excel處于“假死”狀態(tài)
這時我們可以在For……Next循環(huán)中加入一個DoEvents語句,現(xiàn)在代碼變成了下面這個樣子:
Sub MySub()
[a1] = 0
For i = 1 To 10000
DoEvents
[a1] = [a1] + i
Next
End Sub
我們再次運(yùn)行添加了DoEvents語句的代碼。我們發(fā)現(xiàn)剛剛我們遇到的假死狀態(tài)不存在了。系統(tǒng)運(yùn)算他的,我們繼續(xù)我們的工作,想怎么操作就怎么操作,是不是很爽呢?
不過事物都有兩面性,有優(yōu)點(diǎn)肯定也存在不足或者某種隱藏的危險。首先,加入DoEvents后,代碼的運(yùn)行效率會打折扣,這個很好理解,專專心心的干一件事總比三心二意強(qiáng)吧!其次,在關(guān)于DoEvents的幫助文件最后有這么一段:
小心 確保以 DoEvents 放棄控制權(quán)的過程,在第一次 DoEvents 返回之前,不能再次被其他部分的代碼調(diào)用;否則會產(chǎn)生不可預(yù)料的結(jié)果。(這里的意思是:比如上面的MySub在用DoEvents轉(zhuǎn)交控制權(quán)后,被另外一個過程接(假設(shè)是Sub1)管了控制權(quán),Sub1中又調(diào)用MySub這種情況) 此外,如果其它的應(yīng)用程序可能會和本過程以不可預(yù)知的方式進(jìn)行交互操作,那么也不要使用 DoEvents,因?yàn)榇藭r不能放棄控制權(quán)。(這一點(diǎn)也可以舉個例子,也拿上面的那段代碼做例子。那個代碼的本意是在單元格A1中求1+2+3+...+10000的和,但現(xiàn)在我們加入一個Doevents后,程序每循環(huán)一次后都會釋放一下控制權(quán)讓系統(tǒng)有機(jī)會去處理其他的事情,就是因?yàn)檫@樣我們才有機(jī)會在他運(yùn)算時繼續(xù)操作Excel。很不幸的是,我們在那個代碼運(yùn)算過程中手工在A1中輸入了一個不知多大的數(shù),然后那個代碼繼續(xù)運(yùn)算,還是老老實(shí)實(shí)的[a1]=[a1]+i,結(jié)果可想而知,99%不會等于1到10000累加的和,因此在那種情況下釋放控制權(quán)是有隱患的,雖然你可能不會去更改A1,但只要有1%的可能就是隱患)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。