Below is the procedure, which is essentially a bi-section method. The bold lines are where the error happens. I figure the more info I give, the more likely someone will be able to help.
Sub RunSeek(wks As Worksheet)
Dim i As Integer
Dim benchmark As Double
Dim Tolerance As Double
Dim RequiredRuns As Double
Dim LowGuess As Double
Dim HighGuess As Double
Dim MidGuess As Double
Dim MidAns As Double
Dim MagErr As Double
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
benchmark = Timer
Tolerance = 0.001
For i = 0 To 10
If wks.Cells(5 + i, 2) = 0 Then
wks.Cells(5 + i, 7) = 0
Else
RequiredRuns = wks.Cells(5 + i, 2)
LowGuess = 1 - 1 / wks.Cells(5 + i, 5)
HighGuess = 1
MidGuess = (LowGuess + HighGuess) / 2
wks.Cells(5 + i, 7).Value = MidGuess
wks.Range(wks.Name & "CalcRange" & i + 1).Calculate
MidAns = wks.Cells(5 + i, 8)
MagErr = Abs(RequiredRuns - MidAns)
Do Until MagErr < Tolerance
If MidAns < RequiredRuns Then
LowGuess = MidGuess
Else
HighGuess = MidGuess
End If
MidGuess = (LowGuess + HighGuess) / 2
wks.Cells(5 + i, 7).Value = MidGuess
wks.Range(wks.Name & "CalcRange" & i + 1).Calculate
MidAns = wks.Cells(5 + i, 8)
MagErr = Abs(RequiredRuns - MidAns)
Loop
End If
Next i
Application.ScreenUpdating = True
MsgBox (Timer - benchmark)
End Sub
|