Страницы: 1
RSS
Решение уравнения в VBA по данным таблицы
 
Добрый день!  
Собственно задача простая: решить квадратное уравнение ax^2 + bx+c =0  
В таблицу вводят данные a,b,c. Дальше пользователь должен нажать на кнопку и в ответе появится ответ. и тут проблема с макросом возникла " Object doesn't support this property or method (Error 438) " Объясните, что не так  
 
Sub Res()  
Dim y As String  
Dim ax, bx, dx, al, be, a, b, c As Single  
a = Cells(3, 2).Valua  
b = Cells(4, 2).Valua  
c = Cells(5, 2).Valua  
If b ^ 2 - 4 * a * c < 0 Then  
al1 = -b / (2 * a)  
be1 = Sqr(-b ^ 2 + 4 * a * c) / (2 * a)  
y = "Есть два иррациональных корня х1= " + al + "+ i " + be + ", x2 = " + al + "- i " + be  
ElseIf b ^ 2 - 4 * a * c = 0 Then  
ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
y = "Есть один корень х=" + ax  
Else  
ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
bx = (-b - Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
y = "Есть два корня х1 " + ax + ", x2 = " + bx  
End If  
Range("B6").Select  
ActiveCell.FormulaR1C1 = y  
 
End Sub  
 
В файле лист З1 Л3.
 
Исправьте Valua на Valuе  
 
 
a = Cells(3, 2).Value  
b = Cells(4, 2).Value  
c = Cells(5, 2).Value
 
Ой! НЕ заметила. Спасибо. Как соединить теперь текст и числа в строк. как у меня написано - идет ошибка. Подскажите
 
Хм... ошибка в коде заключается в том, что переменные взяты в кавычки. Например:  
y = "Есть два иррациональных корня х1= " + al + "+ i " + be + ", x2 = " + al + "- i " + be  
al - если это переменная должна стоять вне кавычек, вот только если это переменная то, где вы ее вычисляете? У вас вычисляется al1 , но не al.  
Далее, если перить формуле на листе "З1 Л1", то в случае когда b ^ 2 - 4 * a * c < 0 нужно выводить результат "Нет действительных корней", а вы выводите "Есть два иррациональных корня". Приведите, пожалуйста, пример в порядок, а то сложно понять, какой результат нужен.
 
Пробуйте  
 
Sub Res()  
Dim y As String  
Dim ax, bx, dx, al, be, a, b, c As Single  
a = [B3].Value
b = [B4].Value
c = [B5].Value
If b ^ 2 - 4 * a * c < 0 Then  
   al1 = -b / (2 * a)  
   be1 = Round(Sqr((-b) ^ 2 + 4 * a * c) / (2 * a), 5)  
   y = "Есть два иррациональных корня х1= " & al1 & "+ i " & be1 & " + , x2 =  + " & al1 & " - i + " & be1  
ElseIf b ^ 2 - 4 * a * c = 0 Then  
   ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
   y = "Есть один корень х= " & ax  
Else  
   ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
   bx = (-b - Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
   y = "Есть два корня х1= " & ax & " , x2 =  " & bx  
End If  
[B6] = y
 
End Sub
 
{quote}{login=Baklanoff}{date=19.09.2012 12:55}{thema=}{post}Хм... ошибка в коде заключается в том, что переменные взяты в кавычки. Например:  
y = "Есть два иррациональных корня х1= " + al + "+ i " + be + ", x2 = " + al + "- i " + be  
al - если это переменная должна стоять вне кавычек, вот только если это переменная то, где вы ее вычисляете? У вас вычисляется al1 , но не al.  
Далее, если перить формуле на листе "З1 Л1", то в случае когда b ^ 2 - 4 * a * c < 0 нужно выводить результат "Нет действительных корней", а вы выводите "Есть два иррациональных корня". Приведите, пожалуйста, пример в порядок, а то сложно понять, какой результат нужен.{/post}{/quote}  
Переменные я исправила давно. Требования вывод именно иррациональных корней. (Матфак)  
 
Вот код исправленный  
Sub Res()  
' Res Ìàêðîñ  
' Ðåøåíèå êâàäðàòíîãî óðàâíåíèÿ  
Dim y As String  
Dim ax, bx, dx, al, be, a, b, c As Single  
a = Cells(3, 2).Value  
b = Cells(4, 2).Value  
c = Cells(5, 2).Value  
If b ^ 2 - 4 * a * c < 0 Then  
al = -b / (2 * a)  
be = Sqr(-b ^ 2 + 4 * a * c) / (2 * a)  
y = "Åñòü äâà èððàöèîíàëüíûõ êîðíÿ õ1= " & al & "+ i " & be & ", x2 = " & al & "- i " & be  
ElseIf b ^ 2 - 4 * a * B5 = 0 Then  
ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
y = "Åñòü îäèí êîðåíü õ =" & ax  
Else  
ax = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
bx = (-b - Sqr(b ^ 2 - 4 * a * c)) / (2 * a)  
y = "Åñòü äâà êîðíÿ õ1= " & ax & ", x2 = " & bx  
End If  
Range("B6").Select  
ActiveCell.FormulaR1C1 = y  
 
End Sub  
 
Все работает. спасибо за помощь
 
Вы уверены, что работает?  
be = Sqr(-b ^ 2 + 4 * a * c) / (2 * a) - проверьте эту строку. Дело в том, что по правилам VBA переменная b сначала будет возведена в степень и только после этого ей будет присвоена отричательное значение. Во избежание этого требуется -b взять в скобки, как я указал в своем примере. Sqr((-b) ^ 2 + 4 * a * c) / (2 * a).  
Проверьте
 
Baklanoff,  
Вы не помните формулы для решения квадратного уравнения? :))  
Дискриминант = b^2-4ac  
Здесь с обратным знаком. Да и зачем менять знак перед возведением в квадрат?  
(-b)^2=b^2
 
Казанский,  
Нет, не помню.    
А -b брал в скобки чтобы решение сошлось с результатом формулы на втором листе "=КОРЕНЬ(-b^2+4*a*B5)/(2*a)", которое значала присваивает отрицательное значение, а затем возводит в степень, здесь же - наоборот. В результате при а=2 b=2 c=5  
be1 = 1,658312 по формуле  
а во VBA be1 = Sqr(-2 ^ 2 + 4 * 2 * 5) / (2 * 2) = 1.5  
Или я что-то неправильно понимаю?
 
все правильно написано! Посмотрите  в википедии если хотите. Там случай для иррациональных корней как раз такой
 
Формула в примере возвращает отличный от кода результат для D<0. Если уверены, что так надо - пусть. Я лишь обратил ваше внимание на этот факт.
Страницы: 1
Читают тему
Loading...