Как оценить выражение vbscript из javascript через VBA

Последнее обновление MS Office отключило vbscript, который я использую в Excel VBA для оценки выражений. Я обнаружил, что это было значительно быстрее, чем функция VBA "Evaluate" в прошлом, поэтому не хочу этого делать.

Javascript все еще работает, поэтому я пытаюсь перейти на него. Однако некоторые из наших более сложных выражений, в которых используются степени или квадратные корни, не работают без переписывания выражений для использования Math.Pow () и т. д.

Итак, мой вопрос в том, могу ли я запустить javascript, который оценивает выражение vbscript.

Пример того, что я делаю в настоящее время, выглядит следующим образом:

Sub TestVBScript()
Dim objscript As New ScriptControl
Dim var As Variant
Dim str As String
objscript.Language = "vbscript"
str = "2+2"
var = objscript.Eval(str)
MsgBox str & " = " & var
End Sub

Я хочу что-то, что оценивает выражение vbscript, но с использованием javascript, тем самым обходя ошибку MS Office.

Вот информация о проблеме с обновлением MS Office, если кому-то интересно. Я думаю, это может стать большой проблемой для многих: https://social.msdn.microsoft.com/Forums/en-US/45c14333-3685-4b2d-9a3a-6a109a5a2a86/access-2016-microsoft-script-control-stopped-working-error-380?forum=accessdev

Спасибо за помощь!

Я думал, что использование Eval / script control таким образом не рекомендуется. Неэффективно и опасно. Посмотрим, смогу ли я найти что-нибудь на нем ...

QHarr 10.07.2018 14:03

Раздел в этой ссылке называется Никогда не используйте eval!. И в этом отвечать я не специалист. Это как раз то, что я прочитал.

QHarr 10.07.2018 14:05

+1 с тем, что сказал QHarr ^ Вы должны избегать eval как чумы. Тем не менее, существует также встроенный метод Application.Evaluate(), но мне как-то жаль, что я даже дал вам это предложение. Одно из первых правил javascript гласит: все, что вы хотите делать с eval, может быть достигнуто без него, с меньшим количеством отрицательных побочных эффектов.

Samuel Hulla 10.07.2018 14:09

Хотя я не хочу ничего убирать из этих комментариев, использование New ScriptControl, а затем Eval намного менее опасно / вредно, чем просто использование VBA.Eval (или того Eval в JS). ScriptControl.Eval имеет свой прицел. Я все еще мог бы творить зло, если бы получил текстовое поле и все, что в нем было передано этой функции, но это будет сложнее.

Erik A 10.07.2018 14:26

Спасибо . Eval (script) в 10 раз быстрее, чем application.evaluate, поэтому я пытаюсь сделать это таким образом. «Сценарий» - это всегда простое выражение, такое как (1 + 2 + 3 ^ 4), поэтому на самом деле я не запускаю сложные сценарии, а просто использую его как средство для оценки выражения. Есть другие идеи?

bgarrood 10.07.2018 14:26

VBA Evaluate использует синтаксический анализатор и интерпретатор формул Excel. (BTW Worksheet.Evaluate примерно в 2 раза быстрее, чем Application.Evaluate). Не существует эквивалента VBScript Eval для VBA: Eval оценивает выражения VBscript, а не формулы Excel.

Charles Williams 10.07.2018 16:59

Спасибо, Чарльз. Вопрос в том, могу ли я использовать javascript для запуска vbscript. т.е. могу ли я сделать x = eval (javascript), где javascript = eval (vbscript) или аналогичный? Как показано выше, eval (vbscript) обычно работает нормально, за исключением того факта, что последнее обновление MS office убило его. Спасибо!

bgarrood 12.07.2018 15:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
577
1

Ответы 1

Попробуйте это решение:

Sub Test()

    MsgBox Eval("1+2+3^4")

End Sub

Function Eval(s As String)

    Static oDoc As Object

    If oDoc Is Nothing Then
        Set oDoc = CreateObject("htmlfile")
        oDoc.parentWindow.execScript "Function EvalExpr(s): EvalExpr = Eval(s): End Function", "vbscript"
    End If
    Eval = oDoc.parentWindow.EvalExpr(s)

End Function

Другие вопросы по теме