我在片改變事件代碼。封裝在Application.EnableEvents = False中,我有一些Case選擇被觸發。請參閱工作表的代碼和圖像。我擁有的所有東西都是這樣工作的,但我意識到我沒有爲D4(購買價格)改變時需要更新的某些單元設計。 即:D14。我注意到通過點擊單元格會刷新計算出的新值,但用戶只希望相關的所有計算都會隨着D4更改而自動更新。在其他計算完成後,用戶可能會更改一些其他單元格。例如影響其他細胞的租金收入。我一直在努力尋找在哪裏輸入這些額外的變化。 我認爲我可以在一個合適的情況下添加D14 = B14 * D4,但我不斷收到意外的循環和事情。我的邏輯只是不能解決這個問題:(我不想再通過顯示我已經嘗試過的代碼來混淆這一點,在我意識到我的工作表沒有完成之前,我剛剛列入了工作內容。任何幫助,將不勝感激。 使用enableEvents方法和案例越來越複雜和循環問題
Private Sub Worksheet_Change(ByVal Target As range)
Application.EnableEvents = False '<--| disable events handling
On Error GoTo ErrorHandler '<--| be sure to catch any error and enable events handling back
Select Case Target.Address
Case "$D$5" ' Downpayment Entered
range("B5") = (range("D5").Value/range("D4").Value) * 100
Debug.Print "Percent " & range("B5").Value
Case "$B$5" ' Percent Entered
range("D5").Value = (range("D4").Value * range("B5").Value)/100
Debug.Print "DownPayment " & range("D5").Value
'2 cases for Rental Income
Case "$C$9" ' Monthly Rental Entered
range("D9") = (range("C9").Value * 12)
Debug.Print "Monthly Rental Entered"
Case "$D$9" ' Yearly Entered
range("C9").Value = range("D9")/12
Debug.Print "Yearly Rental Entered"
'3 cases for Vacancy Rate
Case "$D$10" ' Yearly Vacancy Rate Entered
range("C10").Value = range("D10")/12
range("B10").Value = range("D10").Value/range("D9") * 100
Debug.Print "Yearly Vacancy Rate Entered"
Case "$C$10" ' Monthly Vacancy Rate Entered
range("D10").Value = range("C10").Value * 12
range("B10").Value = range("D10").Value/range("D9") * 100
Debug.Print "Monthly Vacancy Rate Entered "
Case "$B$10" ' % Vacancy Rate Entered
range("D10").Value = (range("D9").Value * range("B10").Value)/100
range("C10").Value = range("D10").Value/12
Debug.Print "% Vacancy Rate Entered "
'3 cases for Property Tax Entered
Case "$D$14" ' Yearly Prop Tax Entered
range("B14").Value = range("D14").Value/range("D4") * 100
range("C14").Value = range("D14").Value/12
Debug.Print "Yearly Prop Tax Entered"
Case "$C$14" ' Monthly Prop Tax Entered
range("D14").Value = range("C14").Value * 12
range("B14").Value = range("D14").Value/range("D4") * 100
Debug.Print "Monthly Prop Tax Entered"
Case "$B$14" ' Percent of Prop Tax Entered
range("D14").Value = (range("D4").Value * range("B14").Value)/100
range("C14").Value = range("D14").Value/12
Debug.Print "Percent Prop Tax Entered"
'3 cases for Property Management Entered
Case "$D$15" ' Yearly Property Management Entered
range("B15").Value = range("D15").Value/range("D9") * 100
range("C15").Value = range("D15").Value/12
Debug.Print "Yearly Prop Mgmt Entered"
Case "$C$15" ' Monthly Property Management Entered
range("D15").Value = range("C15").Value * 12
range("B15").Value = range("D15").Value/range("D9") * 100
Debug.Print "Monthly Prop Mgmt Entered"
Case "$B$15" ' Percent of Property Management Entered
range("D15").Value = range("D9").Value * range("B15").Value/100
range("C15").Value = range("D15").Value/12
Debug.Print "Percent Prop Mgmt Entered"
'3 cases for Insurance Entered
Case "$D$16" ' Yearly Insurance Entered
range("B16").Value = range("D16").Value/range("D4") * 100
range("C16").Value = range("D16").Value/12
Debug.Print "Yearly Prop Tax Entered"
Case "$C$16" ' Monthly Insurance Entered
range("D16").Value = range("C16").Value * 12
range("B16").Value = range("D16").Value/range("D4") * 100
Debug.Print "Monthly Prop Tax Entered"
Case "$B$16" ' Percent of Insurance Entered
range("D16").Value = (range("D4").Value * range("B16").Value)/100
range("C16").Value = range("D16").Value/12
Debug.Print "Percent Prop Tax Entered"
'3 cases for Maintenance Entered
Case "$D$17" ' Yearly Maintenance Entered
range("B17").Value = range("D17").Value/range("D11") * 100
range("C17").Value = range("D17").Value/12
Debug.Print "Yearly Maintenance Entered"
Case "$C$17" ' Monthly Maintenance Entered
range("D17").Value = range("C17").Value * 12
range("B17").Value = range("D17").Value/range("D11") * 100
Debug.Print "Monthly Maintenance Entered"
Case "$B$17" ' Percent of Maintenance Entered
range("D17").Value = (range("D11").Value * range("B17").Value)/100
range("C17").Value = range("D17").Value/12
Debug.Print "Percent Maintenance Entered"
'3 cases for Other Expenses Entered
Case "$D$18" ' Yearly Other Expenses Entered
range("B18").Value = range("D18").Value/range("D11") * 100
range("C18").Value = range("D18").Value/12
Debug.Print "Yearly Other Expenses Entered"
Case "$C$18" ' Monthly Other Expenses Entered
range("D18").Value = range("C18").Value * 12
range("B18").Value = range("D18").Value/range("D11") * 100
Debug.Print "Monthly Other Expeneses Entered"
Case "$B$18" ' Percent of Other Expeneses Entered
range("D18").Value = (range("D11").Value * range("B18").Value)/100
range("C18").Value = range("D18").Value/12
Debug.Print "Percent Other Expeneses Entered"
'2 cases for Mortgage Entered
Case "$C$21" ' Monthly Entered
range("D21") = (range("C21").Value * 12)
Debug.Print "Monthly Mortgage Entered"
Case "$D$21" ' Yearly Entered
range("C21").Value = range("D21")/12
Debug.Print "Yearly Mortgage Entered"
End Select
ErrorHandler:
Application.EnableEvents = True '<--| enable events handling
End Sub
你會更好重新設計這個使用公式儘可能多的。我沒有看到有任何好處通過VBA管理所有的計算將特定樣式應用於「輸入」單元格,以便將它們與計算出的值輕鬆區分開來 –
謝謝你的建議。我不清楚這將如何幫助,因爲有太多的輸入單元與其他輸入單元交互,重新計算另一個輸入單元。我相信,除了我有限的知識和對我創建電子表格的非常罕見的需求,我會有一個比我的更優雅的解決方案,一個有經驗的vba/excel程序員可以做的。我想我會獨自一人離開,並將它們綁在一起。感謝您的幫助。 – geddeca
理想地「輸入」和「輸出」是分開的:如果用戶在一個地方輸入一個值,然後進入/改變另一個值別處不應改變該第一輸入端。這對於最終用戶來說會相當混亂。 –