Как получить неотрицательное значение с помощью оператора До или если? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть полиномиальное уравнение, которое я хочу решить: L ^ 3-4043L-60647 = 0, используя поиск цели в VBA. Это уравнение дает 3 корня: L1 = 70,06, L2, -54,04 и L3 = -16,02 согласно моему калькулятору. Но я только хочу, чтобы мой L в моей ячейке Excel показывал первый положительный корень в качестве моего ответа. Однако, когда я делаю поиск цели с использованием VBA, это дает мне только -16,02. Как мне сказать в моем коде, чтобы решить только для положительного значения?

Я уже пытался использовать До и до утверждения. Однако, до тех пор, пока оператор не продолжал падать, а оператор If дал мне неправильные значения.

Sub GoalSeek()

 'GoalSeek Macro
Dim Length As Double
Dim i As Long
Range("Length") = i

If i > 0 Then

    Application.CutCopyMode = False
    Application.CutCopyMode = False

    Range("GS").GoalSeek Goal:=0.1, ChangingCell:=Range("Length")

Else

End If
End Sub

Я пытался использовать это утверждение if. Тем не менее, мой L или «Длина» подходит только к 0. Я очень начинающий уровень в VBA. Я не знаю, что я делаю неправильно.

1 Ответ

0 голосов
/ 02 июня 2019

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 или даже значение, превышающее его в результате формулы, вы получите ошибка.

...