Последнее обновление 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!. И в этом отвечать я не специалист. Это как раз то, что я прочитал.
+1 с тем, что сказал QHarr ^ Вы должны избегать eval как чумы. Тем не менее, существует также встроенный метод Application.Evaluate(), но мне как-то жаль, что я даже дал вам это предложение. Одно из первых правил javascript гласит: все, что вы хотите делать с eval, может быть достигнуто без него, с меньшим количеством отрицательных побочных эффектов.
Хотя я не хочу ничего убирать из этих комментариев, использование New ScriptControl, а затем Eval намного менее опасно / вредно, чем просто использование VBA.Eval (или того Eval в JS). ScriptControl.Eval имеет свой прицел. Я все еще мог бы творить зло, если бы получил текстовое поле и все, что в нем было передано этой функции, но это будет сложнее.
Спасибо . Eval (script) в 10 раз быстрее, чем application.evaluate, поэтому я пытаюсь сделать это таким образом. «Сценарий» - это всегда простое выражение, такое как (1 + 2 + 3 ^ 4), поэтому на самом деле я не запускаю сложные сценарии, а просто использую его как средство для оценки выражения. Есть другие идеи?
VBA Evaluate использует синтаксический анализатор и интерпретатор формул Excel. (BTW Worksheet.Evaluate примерно в 2 раза быстрее, чем Application.Evaluate). Не существует эквивалента VBScript Eval для VBA: Eval оценивает выражения VBscript, а не формулы Excel.
Спасибо, Чарльз. Вопрос в том, могу ли я использовать javascript для запуска vbscript. т.е. могу ли я сделать x = eval (javascript), где javascript = eval (vbscript) или аналогичный? Как показано выше, eval (vbscript) обычно работает нормально, за исключением того факта, что последнее обновление MS office убило его. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте это решение:
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
Я думал, что использование Eval / script control таким образом не рекомендуется. Неэффективно и опасно. Посмотрим, смогу ли я найти что-нибудь на нем ...