2016-11-12 17 views
0

我在片改變事件代碼。封裝在Application.EnableEvents = False中,我有一些Case選擇被觸發。請參閱工作表的代碼和圖像。我擁有的所有東西都是這樣工作的,但我意識到我沒有爲D4(購買價格)改變時需要更新的某些單元設計。 即:D14。我注意到通過點擊單元格會刷新計算出的新值,但用戶只希望相關的所有計算都會隨着D4更改而自動更新。在其他計算完成後,用戶可能會更改一些其他單元格。例如影響其他細胞的租金收入。我一直在努力尋找在哪裏輸入這些額外的變化。 我認爲我可以在一個合適的情況下添加D14 = B14 * D4,但我不斷收到意外的循環和事情。我的邏輯只是不能解決這個問題:(我不想再通過顯示我已經嘗試過的代碼來混淆這一點,在我意識到我的工作表沒有完成之前,我剛剛列入了工作內容。任何幫助,將不勝感激。 My sheet使用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 
+0

你會更好重新設計這個使用公式儘可能多的。我沒有看到有任何好處通過VBA管理所有的計算將特定樣式應用於「輸入」單元格,以便將它們與計算出的值輕鬆區分開來 –

+0

謝謝你的建議。我不清楚這將如何幫助,因爲有太多的輸入單元與其他輸入單元交互,重新計算另一個輸入單元。我相信,除了我有限的知識和對我創建電子表格的非常罕見的需求,我會有一個比我的更優雅的解決方案,一個有經驗的vba/excel程序員可以做的。我想我會獨自一人離開,並將它們綁在一起。感謝您的幫助。 – geddeca

+0

理想地「輸入」和「輸出」是分開的:如果用戶在一個地方輸入一個值,然後進入/改變另一個值別處不應改變該第一輸入端。這對於最終用戶來說會相當混亂。 –

回答

0

也許添加此?

Select Case Target.Address 
    Case "$D$4" 
     range("B5") = (range("D5").Value/range("D4").Value) * 100 
     range("D5").Value = (range("D4").Value * range("B5").Value)/100 
     range("B14").Value = range("D14").Value/range("D4") * 100 
     range("D14").Value = (range("D4").Value * range("B14").Value)/100 
     range("B16").Value = range("D16").Value/range("D4") * 100 
     range("D16").Value = (range("D4").Value * range("B16").Value)/100 
     ... 
End Select 
ErrorHandler: 
    Application.EnableEvents = True '<--| enable events handling 
+0

是的,這確實奏效。當它不起作用時,我不知道我在做什麼。我有一些如果然後發生案件會觸發等。這是一場噩夢。 – geddeca