Страница 1 из 1
Нужен совет
Добавлено: 30 авг 2009, 06:14
Nik ADA
Ребята нужна помощь, есть задачка не простая, нужно в одном окне вводить в текстовое поле формулу скажем
в другом окне нужно вести переменные
Код: Выделить всё
от ворсулы видно что переменная это r, во второй формуле больше переменных
после ввода он выдавал результат помогите реализовать, скажем ввод и выод это не проблема, проблема заключаеться в определении количества переменных и вункций выполнения (операторов *,+,- и т.д. их может быть разное количество)
Re: Нужен совет
Добавлено: 30 авг 2009, 06:36
EducatedFool
В Excel это реализуется достаточно просто:
Код: Выделить всё
[color=darkblue]Sub[/color] test()
f = InputBox("Введите формулу", , "4*r^2")
r = InputBox("Введите значение R", , "5")
MsgBox "Результат: " & Application.Evaluate(Replace(f, "r", r))
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
Но надо учитывать множество нюансов, и проверять формулы/значения на корректность.
Re: Нужен совет
Добавлено: 30 авг 2009, 07:30
Nik ADA
дело в том что не кто не знает какая будет формула и какие будет переменные (названия букв) то есть просто поле ввода, для формулы (TextBox) скажем, и такое же поле или несколько в зависимости от переменных поля для ввода данных.
То есть при воде в формулу
b*c*sin(A)/2
он для ввода данных выдал всего 2 поля ввода данных для B и для C.
загвозка в том что неизвестно какая будет введена формула.
Re: Нужен совет
Добавлено: 30 авг 2009, 08:38
EducatedFool
Так, что ли, надо?
Можете вводить любую формулу - поля для ввода присутствующих в ней переменных отобразятся автоматически.
Безусловно, присутствует множество ограничений на имена переменных и распознаваемых функций.
На форуме встречались более удачные примеры.
Вот весь код:
Код: Выделить всё
[color=darkblue]Dim[/color] arr, coll [color=darkblue]As[/color] Collection
[color=darkblue]Private[/color] [color=darkblue]Sub[/color] CommandButton1_Click()
txt = Me.TextBox_Main
[color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] coll
txt = Replace(txt, w, Значение(w))
[color=darkblue]Next[/color]
Me.TextBox_tmp = txt: [color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
Me.TextBoxResult = Application.Evaluate(Replace(txt, ",", "."))
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
[color=darkblue]Private[/color] [color=darkblue]Sub[/color] TextBox_Main_Change()
ПоискПеременных (Me.TextBox_Main)
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
[color=darkblue]Sub[/color] ПоискПеременных([color=darkblue]ByVal[/color] txt [color=darkblue]As[/color] [color=darkblue]String[/color])
СписокФункций = Array("sin", "cos", "tg", "exp")
ЦифрыИСимволы = "0123456789+-*/^()"
[color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] СписокФункций: txt = Replace(txt, w, " "): [color=darkblue]Next[/color]
[color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] Len(ЦифрыИСимволы): txt = Replace(txt, Mid(ЦифрыИСимволы, i, 1), " "): [color=darkblue]Next[/color]
arr = Split(Application.Trim(txt), " ")
Me.TextBoxResult = Application.Trim(txt)
[color=darkblue]Set[/color] coll = [color=darkblue]New[/color] Collection: [color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
[color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] arr
coll.Add w, [color=darkblue]CStr[/color](w)
[color=darkblue]Next[/color]
[color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] 7
Me.Controls("Textbox" & i).Visible = coll.Count >= i
Me.Controls("Label" & i).Visible = coll.Count >= i
Me.Controls("Label" & i).Caption = UCase(coll(i)) & " = "
[color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
[color=darkblue]Private[/color] [color=darkblue]Sub[/color] UserForm_Initialize()
Me.TextBox_Main = "12*a+a/c+d^2-sin(e*c)"
[color=darkblue]End[/color] Sub
[color=darkblue]Function[/color] Значение([color=darkblue]ByVal[/color] w [color=darkblue]As[/color] [color=darkblue]String[/color]) [color=darkblue]As[/color] [color=darkblue]Double[/color]
[color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
[color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] 7
[color=darkblue]If[/color] Me.Controls("Label" & i).Caption = UCase(w) & " = " [color=darkblue]Then[/color]
Значение = [color=darkblue]CDbl[/color](Replace(Me.Controls("Textbox" & i), ".", ","))
[color=darkblue]Exit[/color] [color=darkblue]Function[/color]
[color=darkblue]End[/color] [color=darkblue]If[/color]
[color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]Function[/color]
Re: Нужен совет
Добавлено: 30 авг 2009, 08:50
Nik ADA
в точку, тока вопрос переменные A C D E и текстовые поля ставяться у меня

Re: Нужен совет
Добавлено: 30 авг 2009, 08:54
EducatedFool
а как сделать так что бы он сам их создавал столько сколько нужно если там не 4 переменных а всего 3 или 2 или больше.
Просто ввести другую формулу в соответствующее поле на форме:
По умолчанию вводится формула
12*a+a/c+d^2-sin(e*c)
Код: Выделить всё
[color=darkblue]Private[/color] [color=darkblue]Sub[/color] UserForm_Initialize()
Me.TextBox_Main = "12*a+a/c+d^2-sin(e*c)"
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
Поэтому отображаются поля для 4-х переменных.
Максимум для данной версии программы - 7 переменных.
Re: Нужен совет
Добавлено: 30 авг 2009, 09:28
Nik ADA
Огромное спасибо EducatedFool помог решить задачку. тему можно закрыть