【问题标题】:How to evaluate vbscript expression from javascript via VBA如何通过 VBA 从 javascript 评估 vbscript 表达式
【发布时间】:2018-07-17 17:50:23
【问题描述】:

最新的 MS Office 更新禁用了我在 Excel VBA 中用于评估表达式的 vbscript。我发现这比过去的 VBA“评估”功能要快得多,因此希望避免这样做。

Javascript 仍然有效,所以我正在尝试迁移到它。但是,如果不重写表达式以使用 Math.Pow() 等,我们的一些更复杂的表达式(使用幂或平方根)将无法工作。

所以我的问题是我是否可以运行评估 vbscript 表达式的 javascript。

我目前正在做的示例如下:

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 控件。不高效且危险。看看我能不能在上面找到什么......
  • 该链接中称为Do not ever use eval! 的部分。而这个answer我不是专家。这正是我所读到的。
  • +1 与 QHarr 所说的 ^ 你应该避免像瘟疫一样避免eval。然而,还有一个内置的 Application.Evaluate() 方法,但我什至对给你这个建议感到难过。 javascript 的第一条规则之一是,无论你想用 eval 做什么,没有它都可以实现,并且负面影响更少
  • 虽然我不想从这些 cmets 中拿走任何东西,但使用 New ScriptControl 然后使用 Eval 比仅使用 VBA.Eval (或 Eval在 JS 中)。 ScriptControl.Eval 有自己的作用域。如果我得到一个文本框并将其中的所有内容传递给该函数,我可能仍然能够做坏事,但这会更难。
  • 谢谢。 Eval(script) 比 application.evaluate 快 10 倍以上,这就是我尝试这样做的原因。 “脚本”始终是一个简单的表达式,例如 (1+2+3^4),所以实际上我并没有运行复杂的脚本,只是将它用作评估表达式的一种手段。还有其他想法吗?

标签: javascript excel vba vbscript


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    相关资源
    最近更新 更多