Как оценить введенные формулы в Excel

Если я наберу формулу 1/4*pi()*($A$1)^2 в виде строки в ячейке и предполагаю, что у меня есть значение в $A$1, я использую следующую функцию VBA в третьей ячейке для оценки формулы:

Public Function E(byval TextFormula as String) as Variant
  E = Evaluate(TextFormula)
End Function  

Есть ли способ использовать математические символы, такие как •, √, ¼, π, ² и т. д., чтобы моя напечатанная формула выглядела более приятной? Даже переведите «[» и «]» как «(» и «)». Я могу просто перебирать замены массива, используя функцию REPLACE() для простых символов, но как насчет расширенных символов, таких как π?

Для действительно крутых макро-мастеров...

Как насчет отображения промежуточных шагов (итераций), поскольку в (2*3) + (2.5*4) оценивается 6 + 10 в первой итерации, а затем 16 в следующей итерации. В дополнение: я бы хотел, чтобы итерации останавливались непосредственно перед каждым набором сложений/вычитаний, потому что иногда мне хотелось бы знать, каковы относительные величины отдельных оцениваемых членов, чтобы увидеть, какая часть моей формулы контролирует результат.

А для мегагениальных...

А что насчет смешанных юнитов? Например, ввести 560{lbs}/[1.23{m}*3.4{'}] и получить результат ###{psf}. Я думал, что единица может быть обозначена символом подчеркивания, таким как 34_kN, но я думаю, что для составных единиц, таких как 34{kN/m^2}, требуется начальное и конечное разграничение. Должен быть способ принудительно вывести вывод в желаемую единицу (т. е. мм вместо дюймов), например, настроить нужные единицы вперед на вашем листе, а затем он, по крайней мере, попытается преобразовать в одну из этих единиц. Я думаю, на этом этапе вы будете брать с меня деньги за код ;)

Мне нравится использовать Excel для инженерных расчетов, потому что я использую только более простые формулы (без исчисления!) и не хочу постоянно переключаться между приложениями Excel и Mathcad, а использую только одно.

Шон


person Shawn Pauliszyn    schedule 08.07.2015    source источник


Ответы (1)


Это высокие заказы. Следующий подраздел может дать вам идею для вашего первого вопроса:

Sub test()
    Dim R As Range
    Set R = Range("A1")
    R.Value = "A = pr2"
    R.Characters(5, 1).Font.Name = "Symbol"
    R.Characters(7, 1).Font.Superscript = True
End Sub

Запустите его, а затем посмотрите содержимое A1.

Что касается вашего второго вопроса - конечно, вы можете это сделать, но вам нужно будет написать полноценный анализатор выражений. Написание одного с нуля довольно сложно (по крайней мере, пара сотен строк кода), и, вероятно, лучше всего это сделать, используя классы для создания пользовательского типа данных дерева, а затем написав анализатор рекурсивного спуска для анализа строк в деревья выражений. Выполнимо, хотя у меня нет ни времени, ни желания этим заниматься.

Я не совсем уверен, к чему вы клоните в своем последнем вопросе, хотя моя внутренняя реакция такова, что он проще, чем ваш второй вопрос, поскольку не требуется реального синтаксического анализа, и достаточно легко создать словарь коэффициентов преобразования.

person John Coleman    schedule 08.07.2015
comment
Привет Джон и спасибо. Возможно, я не смогу программно изменять символы таким образом каждый раз, когда ввожу формулу. Я подумывал просто вставить символ из команды INSERT -> SYMBOL на ленту в том шрифте, который я использую (например, Arial или Calibri). В качестве альтернативы я уже запрограммировал некоторые из основных и добавил греческий язык в свой АВТОЗАПРАВКУ, например, \a дает мне α, * дает мне ·, _| дает мне ⊥, \^2 дает мне ², \/ дает мне √ и т. д. В качестве альтернативы, альтернативно, я могу просто удерживать Alt и набирать код символа и получать его таким образом. Alt-0248 дает мне ø. - person Shawn Pauliszyn; 09.07.2015
comment
Я не думал программно изменять каждую формулу так, как это делал мой саб. Это было просто для иллюстрации того, что VBA может настраивать шрифт для отдельных символов и, таким образом, создавать строки, которые отображаются как комбинации обычных символов и символов. Чтобы сделать его полезным, вам нужно создать своего рода код, где, например. \p равно pi (вроде того, что вы уже делаете с автозаменой), а затем пусть VBA реализует схему перевода. То, что вы уже делаете, звучит умно, но подход VBA может быть более гибким. - person John Coleman; 09.07.2015