GoalSeek получает ближайшие решения к начальному значению.
Вы можете использовать следующий код:
Sub GoalSeek()
Dim i As Double
'Set the initial value to a very high number
Range("Result").Value = 9999
'Ask GoalSeek to get the neares solution to that high value
Range("Formula").GoalSeek Goal:=0, ChangingCell:=Range("Result")
If Range("Result").Value > 0 Then
'If the value is positive, we need to make sure that it is the first positive solution
i = -1
Do
i = i + 1
'Set a new inital value. This time, a small one (starting from 0)
Range("Result").Value = i
'Ask GoalSeek to get the neares solution to the small initial value
Range("Formula").GoalSeek Goal:=0, ChangingCell:=Range("Result")
'If the result is negative, loop (increase the initial value and try again till you find the first positive one
Loop While Range("Result").Value < 0
Else 'If the nearest result to the high value is negative, keep it & show a message box.
MsgBox "No +ve solution found"
End If
End Sub
В вашем примере у вас есть три решения 70.06, -54.04 и -16.02
Ближайший к 0 - -16,02, к 9999 - 70,6 и к -9999 - -54,04
Что если бы решения были -5, 7 и 12?
Ближайший к 9999 - 12, но вы хотите 7, верно?
Таким образом, мы запрашиваем ближайший к 0 (-5), затем мы продолжаем увеличивать начальное значение, пока ближайшее решение не станет 7.
Обратите внимание, что это предполагает, что у вас есть представление о том, какими будут результаты.
Например, если решения -1 и 1 000 000, этот код не будет работать, поскольку -1 ближе к 9999, чем 1 000 000.
В этом случае вам нужно будет еще больше изменить начальное значение.
И если вы установите слишком высокое значение, которое превышает предел двойного типа данных 1.79E + 308 или даже значение, превышающее его в результате формулы, вы получите ошибка.