Спасибо всем за ваши идеи и помощь, но я решил взять формулы с листа.Я создал подпрограмму внутри модуля, а затем вызвал подпрограмму из события Worksheet_Change
, и теперь она работает.Я уверен, что код может быть намного чище, но сейчас он работает.
Код модуля:
Sub LTVCalcs()
Dim wb As Workbook
Dim wsSI As Worksheet, wspGen As Worksheet
Dim lAmount As Range, pPrice As Range, eVal As Range, oMtg As Range, oColl As Range, LTV As Range, CLTV As Range, genLTV As Range, genCLTV As Range, keyCells As Range
Dim x As Integer
Set wb = Application.ThisWorkbook
Set wsSI = wb.Sheets("SavedInfo")
Set wspGen = wb.Sheets("pGeneralInfo")
Set lAmount = wsSI.Range("Loan_Amount")
Set pPrice = wsSI.Range("Purchase_Price")
Set eVal = wsSI.Range("Estimated_Value")
Set oMtg = wsSI.Range("Total_Other_Mtg")
Set oColl = wsSI.Range("Additional_Collateral")
Set LTV = wsSI.Range("LTV")
Set CLTV = wsSI.Range("CLTV")
Set genLTV = wspGen.Range("GenLTV")
Set genCLTV = wspGen.Range("GenCLTV")
Set keyCells = wsSI.Range("Loan_Amount,Purchase_Price,Estimated_Value,Total_Other_Mtg,Additional_Collateral")
oMtg = Application.WorksheetFunction.Sum(wsSI.Range("_2nd_Mtg_Amount"), wsSI.Range("_3rd_Mtg_Amount"), wsSI.Range("_4th_Mtg_Amount"), wsSI.Range("_5th_Mtg_Amount"))
If lAmount = vbNullString Then lAmount = 0
If pPrice = vbNullString Then pPrice = 0
If eVal = vbnulsltring Then eVal = 0
If oMtg = vbNullString Or oMtg = 0 Then oMtg = 0
If oColl = vbNullString Then oColl = 0
If LTV = vbNullString Then LTV = 0
If CLTV = vbNullString Then CLTV = 0
If eVal <= pPrice Then
x = 1
Else: x = 2
End If
Application.EnableEvents = False
For Each cell In keyCells
If cell.Value >= 0 Then Application.EnableEvents = True
Select Case x
Case Is = 1
LTV = lAmount / (eVal + oColl)
CLTV = (lAmount + oMtg) / (eVal + oColl)
LP.LTV = LTV
LP.CLTV = CLTV
genLTV = LTV
genCLTV = CLTV
Case Is = 2
LTV = lAmount / (pPrice + oColl)
CLTV = (lAmount + oMtg) / (pPrice + oColl)
LP.LTV = LTV
LP.CLTV = CLTV
genLTV = LTV
genCLTV = CLTV
End Select
Next cell
Application.EnableEvents = True
End Sub
Код в модуле Worksheet:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("Loan_Amount") Then Call LTVCalcs
If Target.Address = Range("Estimated_Value") Then Call LTVCalcs
If Target.Address = Range("Total_Other_Mtg") Then Call LTVCalcs
If Target.Address = Range("Additional_Collateral") Then Call LTVCalcs
If Target.Address = Range("Purchase_Price") Then Call LTVCalcs
End Sub