遇到的一個Execl迭代運算問題,覆盤全過程解決思路

各位朋友,你們好。今天覆盤一個我解決Excel問題的全過程思路。

一、需要的效果

最近編寫一個工作中用的工具,需要用到迭代運算(見下圖),當我在【F4】單元格輸入一個數後,需要讓Excel自動將我輸入的數據乘以【F3】的數據,再填寫到【F4】中,即【F4】=【F4】*【F3】。

遇到的一個Execl迭代運算問題,覆盤全過程解決思路


二、需要的方法

這就是Excel中的循環引用,在常規情況下會提示錯誤無法計算,若要執行計算,需要在選項中設置【迭代運算】。

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

迭代運算設置


三、遇到的第一個問題

於是乎,用VBA寫了幾句代碼,以實現這種效果:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

但是這個代碼在執行過程中,會出現一個問題:

由於用的是工作表【Change】事件觸發的,只要【F4】單元格內容改變,就會不停的觸發計算,但是每次計算都會導致【F4】單元格內容的改變,這就陷入了一個無限循環……這時,即使設置迭代次數為1,都無法避免這個問題……

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

內容改變觸發的迭代運算,無限循環

問題一:現在需要解決迭代運算的計算次數,只進行一次計算。


四、第一個問題的解決

解決思路:

通過思考,想到了一個方法,設置一個開關,用來對迭代計算進行控制。

比如:開啟迭代運算第一次計算時,給【L1】單元格賦值為1,開關關閉。當迭代計算代碼執行時,先判斷【L1】單元格的值,當【L1】=1時,就停止計算。同時再設置一個事件,讓【L1】單元格的值恢復為0,來打開這個開關。(即,當L1單元格為0時,開關狀態為開啟,執行第一次迭代運算;在第一次代碼執行時,給L1賦值為1,關閉開關,計算終止;通過SelectChange事件,恢復L1單元格值為0,開啟開關)。【這段話有點繞,實在看不明白就看下圖紅色框中的代碼和註釋吧……】

然後修改代碼如下:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

第一個問題成功解決


五、遇到的第二個問題

通過上面的代碼,設置一個開關,控制開關的開啟和關閉狀態,解決了迭代運算計算次數的問題。

現在又出現了第二個問題:

Excel的change事件能判斷單元格內容的改變,但是編輯單元格也會觸發Change事件,即使沒有改變單元格內容,Change事件仍然會認為單元格編輯中改變了內容,要執行運算(實際上,當單元格值未改變時,不應該觸發計算)。問題演示如下:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

問題二:現在需要解決編輯單元格時,如果內容沒有改變,則不進行計算。


六、第二個問題的解決

解決思路:在編輯單元格前,有一個選中單元格的過程,那麼通過SelectChange事件,先記錄選中時單元格的值,然後再和編輯完成後的值做對比,如果兩個值相同,則不進行計算。修改後的代碼如下:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

修改後,代碼的執行效果:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路


這個問題難點在於:

①改變單元格的值才會觸發的計算,但是觸發計算時又會引起單元格改變,再次觸發事件,造成不斷循環;

②在單元格內容沒改變時,不因該觸發計算,如何來判斷單元格編輯前後內容是否有改變。

到此,這個問題完美解決。這就是我在遇到問題時的解決全過程,希望對你們有所幫助。


題外話:

在工作中,為了提高工作效率、簡化工作流程,把重複的工作內容交給電腦來處理。抽了一個星期的空餘時間編制了一個定額庫工具,用於快速分析項目成本、拆分和統計項目各種材料、統計各工種的工程量及勞務費用……

這個工具全部模擬專業的計價軟件,先錄入公司的各種勞務和材料成本(企業定額) ,然後導入項目預算(投標)清單,再將企業定額通過本工具錄入清單中,計算項目成本和分析各種數據。下面是部分操作演示:

遇到的一個Execl迭代運算問題,覆盤全過程解決思路

工具演示

點擊項目名稱即可調出(企業)定額查詢錄入工具,通過雙擊項目錄入相應的人工、材料、機械。這次分享的這個問題,就是在編制這個工具的過程中遇到的。但是這個工具還未最終完成,有不少細節待完善(類似本文中遇到的問題,已解決)。

如果你也是從事工程造價工作,有製作一個的企業定額數據庫的想法和需要,那麼可以將你的想法和需求在評論區回覆、或者通過私信留言,大家一起交流和探討。我希望把這個工具做成一個大家都喜歡、並且非常實用的Excel造價工具。


我是上班下班,因為愛好辦公軟件、喜歡分享。所以來到這裡將我的學習心得和踩過的一些坑,和大家聊聊,希望大家學習我成功的經驗,避開我踩過的坑。我和你們一起進步。

好了,今天就聊到這裡,感謝各位朋友的關注和支持。

如果你喜歡我分享的內容,請點個贊支持下;

如果你覺得我分享的內容對你有幫助,可以關注我;

如果要看我以前分享過的好玩的內容,大家可以去我的主頁查看歷史文章。


分享到:


相關文章: