Продолжайте получать Runtime Error '5' VBA, в чем проблема? - PullRequest
1 голос
/ 13 февраля 2020

Я создаю код, который может решить квадратное c уравнение, однако я получаю эту ошибку. Он выделяет функцию x = каждый раз. Я не знаю, что с этим не так, пожалуйста, помогите. Код ниже.

Option Explicit

Sub main()
    Dim a As Double
    Dim b As Double
    Dim c As Double
    Dim x1 As Long

    a = InputBox("Write a number for a")
    b = InputBox("Write a number for b")
    c = InputBox("Write a number for c")

    x1 = (-b + Sqr((b ^ 2) - (4 * a * c))) / (2 * a)
    MsgBox (x1)

End Sub

edit: Благодаря помощи мне удалось запустить программу. Однако числа, которые я получаю для x1 и x2, кажется, не имеют смысла, пытаясь превратить их обратно в уравнение.

Option Explicit

Sub main()
Dim a As Double
Dim b As Double
Dim c As Double
Dim x1 As Double
Dim x2 As Double

a = InputBox("Write a number for a")
b = InputBox("Write a number for b")
c = InputBox("Write a number for c")

'If statement to check if items inside sqr are negative. Being negative would create an imaginary number, and we only need real numbers.
If (b ^ 2) - (4 * a * c) < 0 Then
  MsgBox ("The selected numbers for a, b, and c would make an imaginary number. Please try again.")
'If the selected values for abc do not create an imaginary number, the equation is run giving the two values of the x's.
Else
  x1 = (-b + Sqr((b ^ 2) - (4 * a * c))) / (2 * a)
  x2 = (b + Sqr((b ^ 2) - (4 * a * c))) / (2 * a)
  'Msgbox showing the equation with the values for abc and the values for x1 and x2.
  MsgBox (a & "(x^2)+" & b & "x+" & c & vbNewLine & "x1=" & x1 & vbNewLine & "x2=" & x2)
End If

End Sub

Редактировать: Неважно. У меня был переключен негатив. Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Вы должны быть более осторожны и обрабатывать все случаи (без решений, 1 и 2 решения)

Кроме того, следует быть более осторожным с переменными типами. См. Код ниже (комментарии включены).

Еще один совет: закомментируйте свой код - это безвредно и может принести большую пользу:)

Еще один совет: используйте F8 для отладки (тогда вы можете проверить значения переменные, при запуске кода).

Option Explicit

Sub main()
    ' All variables should be double, especially x1 and x2!
    Dim a As Double
    Dim b As Double
    Dim c As Double
    Dim x1 As Double
    Dim x2 As Double
    ' Collect data from user
    a = InputBox("Write a number for a")
    b = InputBox("Write a number for b")
    c = InputBox("Write a number for c")
    ' First step: calculate delta
    Dim delta As Double
    delta = b * b - 4 * a * c
    ' Check, if we have any solution
    If delta < 0 Then
        MsgBox "Equation has no solutions!"
        Exit Sub
    End If

    If delta = 0 Then
        x1 = -b / (2 * a)
        MsgBox "Found solution: " + CStr(x1)
        Exit Sub
    End If

    x1 = (-b + Sqr(delta)) / (2 * a)
    x2 = (-b - Sqr(delta)) / (2 * a)
    MsgBox "Found solution: x1 = " + CStr(x1) + ", x2 = " + CStr(x2)

End Sub
2 голосов
/ 13 февраля 2020

Включите проверку мнимых чисел:

Sub main()
Dim a As Double
Dim b As Double
Dim c As Double
Dim x1 As Double

a = InputBox("Write a number for a")
b = InputBox("Write a number for b")
c = InputBox("Write a number for c")

If (b ^ 2) - (4 * a * c) < 0 Then
  MsgBox "The square root of ((" & b & " ^ 2) - (4 * " & a & " * " & c & ")) = (" & (b ^ 2) - (4 * a * c) & ") would make an imaginary number."
Else
  x1 = (-b + Sqr((b ^ 2) - (4 * a * c))) / (2 * a)
  MsgBox x1
End If

End Sub

Вот еще одна альтернатива:

Использование ImSqrt для возврата квадрата root комплексного числа в x + yi или x + yj текстовый формат - но он может быть довольно "сложным".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...