2017-08-20 25 views
0

我试图为VBA Excel循环解算器命令,并获取有关模型中的变量和条件的错误消息。该模型的想法是找到一系列的债务和股权融资,以便现金余额为零,债务和股权部分满足某些契约(在解算器运行时作为边界)。VBA Excel - 循环中的求解器返回错误的参考更改单元格和条件

这里是我的代码:

Sub Debt_Capital_Balancing() 

    Application.ScreenUpdating = False 

    Dim Early_Repmnt As String, CashBeforeSolver As Variant, CED As Variant, _ 
    DR As Variant, CC As Variant, TW As Single, NDE As Single, DE As Single, W As Single 

    K = Range("Forecast_periods").Count 
    Range("Debt_Received, Debt_Early_Repayment, RE_Distribution, _ CC_APIC_Change").ClearContents 

    For i = 1 To K 

    CashBeforeSolver = Abs(Range("Cash_Excess_Deficit").Cells(1, i).Value) 
    CED = Range("Cash_Excess_Deficit").Cells(1, i).Value 
    DR = Range("Debt_Received").Cells(1, i).Value 
    CC = Range("CC_APIC_Change").Cells(1, i).Value 
    TW = Range("Target_WACC").Cells(1, i).Value 
    NDE = Range("Net_Debt_To_EBITDA").Cells(1, i).Value 
    DE = Range("D_E").Cells(1, i).Value 
    W = Range("WACC").Cells(1, i).Value 

    SolverReset 
    SolverOk SetCell:=CED, MaxMinVal:=3, ValueOf:=0, ByChange:="DR,CC", Engine:=3, EngineDesc:="Evolutionary" 

    SolverAdd cellRef:=DR, Relation:=3, FormulaText:=0 
    SolverAdd cellRef:=CC, Relation:=3, FormulaText:=0 
    SolverAdd cellRef:=DR, Relation:=1, FormulaText:=CashBeforeSolver 
    SolverAdd cellRef:=CC, Relation:=1, FormulaText:=CashBeforeSolver 
    SolverAdd cellRef:=NDE, Relation:=1, FormulaText:="Target_Net_Debt_To_EBITDA" 
    SolverAdd cellRef:=DE, Relation:=1, FormulaText:="Target_D_E_Ratio" 
    SolverAdd cellRef:=W, Relation:=1, FormulaText:=TW 

    SolverOptions MaxTime:=0, Iterations:=0, Precision:=0.00001, _ 
    Convergence:=0.0001, StepThru:=False, Scaling:=True, AssumeNonNeg:=False, Derivatives:=1 

    SolverOptions PopulationSize:=100, RandomSeed:=0, MutationRate:=0.075, _ 
    Multistart:=False, RequireBounds:=True, MaxSubproblems:=0, MaxIntegerSols:=0, _ 
    IntTolerance:=0.1, SolveWithout:=False, MaxTimeNoImp:=200 

    SolverSolve 

    Next i 

End Sub 

我猜我错误地引用到变量求解器模式。 有人可以帮我吗?可能还有其他一些方法来引用不断变化的细胞和动态条件吗?

非常感谢,

尤里

+0

什么是您的错误消息。 –

+0

单步执行代码: 1.在哪一行发生错误? 2:什么是错误(从Dy.Lee起) – peakpeak

回答

1

好吧,我已经找到了解决办法,可能不是最优的,但它的工作原理。以下是代码:

Sub Debt_Capital_Balancing() 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationAutomatic 

Dim InitCashBalance As Variant 
Dim InitCashBalance2 As Variant 
Dim TargetCell As Variant 
Dim DebtReceivedChangeCell As Variant 
Dim DebtPaidChangeCell As Variant 
Dim REChangeCell As Variant 
Dim CapitalChangeCell As Variant 
Dim DEConstr As Variant 
Dim WACCConstr As Variant 
Dim DtoEBITDAConstr As Variant 
Dim TargWACC As Variant 
Dim TargDE As Variant 
Dim TargDtoEBITDA As Variant 
Dim DebtcfConstr As Variant 
Dim EquitycfConstr As Variant 
Dim MinDE As Variant 

Range("Debt_Received, Debt_Early_Repayment, Dividends, _ 
RE_Distribution, CC_APIC_Change").ClearContents 

K = Range("Forecast_periods").Count 

Set InitCashBalance = Range("Cash_Excess_Deficit").Cells(1, 1) 
Set TargetCell = Range("Cash_Excess_Deficit").Cells(1, 1) 
Set DebtReceivedChangeCell = Range("Debt_Received").Cells(1, 1) 
Set DebtPaidChangeCell = Range("Debt_Early_Repayment").Cells(1, 1) 
Set REChangeCell = Range("RE_Distribution").Cells(1, 1) 
Set CapitalChangeCell = Range("CC_APIC_Change").Cells(1, 1) 
Set DtoEBITDAConstr = Range("Net_Debt_To_EBITDA").Cells(1, 1) 
Set DebtcfConstr = Range("Debt_cf").Cells(1, 1) 
Set EquitycfConstr = Range("Equity_cf").Cells(1, 1) 
Set TargDtoEBITDA = Range("Target_Net_Debt_To_EBITDA") 

For i = 1 To K 

InitCashBalance2 = Abs(InitCashBalance) 

SolverReset 
SolverOk SetCell:=TargetCell.Address, MaxMinVal:=3, ValueOf:=0, _ 
ByChange:=DebtReceivedChangeCell.Address & "," & CapitalChangeCell.Address,_ 
Engine:=3, EngineDesc:="Evolutionary" 

SolverAdd cellRef:=DebtReceivedChangeCell.Address, Relation:=3, FormulaText:=0 
SolverAdd cellRef:=CapitalChangeCell.Address, Relation:=3, FormulaText:=0 
SolverAdd cellRef:=DebtReceivedChangeCell.Address, Relation:=1, FormulaText:=InitCashBalance2 
SolverAdd cellRef:=CapitalChangeCell.Address, Relation:=1, FormulaText:=InitCashBalance2 
SolverAdd cellRef:=DtoEBITDAConstr.Address, Relation:=1, _ FormulaText:=TargDtoEBITDA 
SolverAdd cellRef:=DebtcfConstr.Address, Relation:=3, FormulaText:=0 
SolverAdd cellRef:=EquitycfConstr.Address, Relation:=3, FormulaText:=0 

SolverOptions MaxTime:=0, Iterations:=0, Precision:=0.00001, _ 
Convergence:=0.0001, StepThru:=False, Scaling:=True, _ 
AssumeNonNeg:=False, Derivatives:=1 

SolverOptions PopulationSize:=100, RandomSeed:=0, MutationRate:=0.075, _ 
Multistart:=False, RequireBounds:=True, MaxSubproblems:=0, _ 
MaxIntegerSols:=0, IntTolerance:=0.1, SolveWithout:=False, MaxTimeNoImp:=200 

SolverSolve userFinish:=True 
SolverFinish KeepFinal:=1 

Set InitCashBalance = InitCashBalance.Offset(0, 1) 
Set TargetCell = TargetCell.Offset(0, 1) 
Set DebtReceivedChangeCell = DebtReceivedChangeCell.Offset(0, 1) 
Set DebtPaidChangeCell = DebtPaidChangeCell.Offset(0, 1) 
Set REChangeCell = REChangeCell.Offset(0, 1) 
Set CapitalChangeCell = CapitalChangeCell.Offset(0, 1) 
Set DtoEBITDAConstr = DtoEBITDAConstr.Offset(0, 1) 
Set DebtcfConstr = DebtcfConstr.Offset(0, 1) 
Set EquitycfConstr = EquitycfConstr.Offset(0, 1) 

Next i 

Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 

End Sub