Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net VBA中的MS脚本控件_Vb.net_Vba_Vbscript - Fatal编程技术网

Vb.net VBA中的MS脚本控件

Vb.net VBA中的MS脚本控件,vb.net,vba,vbscript,Vb.net,Vba,Vbscript,我通常使用VB.Net进行编程,但我被委派到一个VBA项目,该项目将受益于使用脚本控件运行脚本。下面是示例代码,但在代码的.Run行中出现错误。我可以在VB.Net中轻松完成这项工作,但无法在vba中实现 错误=参数数目错误或属性赋值无效 Option Explicit Dim sc As New ScriptControl Sub RunFunctions() MsgBox (Eval("2 * PI")) End Sub Function Eval(expr As String)

我通常使用VB.Net进行编程,但我被委派到一个VBA项目,该项目将受益于使用脚本控件运行脚本。下面是示例代码,但在代码的.Run行中出现错误。我可以在VB.Net中轻松完成这项工作,但无法在vba中实现

错误=参数数目错误或属性赋值无效

Option Explicit
Dim sc As New ScriptControl

Sub RunFunctions()
    MsgBox (Eval("2 * PI"))
End Sub

Function Eval(expr As String) As Object
    Dim code As String
    code = "Dim PI" & vbCrLf & _
           "PI = 3.1416" & vbCrLf & _
           " " & vbCrLf & _
           "Function Result" & vbCrLf & _
           "    Result = " & expr & vbCrLf & _
           "End Function"

    sc.Language = "VBScript"
    sc.AllowUI = True
    sc.AddCode (code)
    Dim myparams() as variant

    Eval = sc.Run("Result", myparams)

End Function
使用脚本控件对象中的.Eval函数可以在vba中运行ok,但不运行脚本。这里有一个例子,如果有人想知道

Sub SimpleTask()
    Dim expr As String
    sc.Language = "VBScript"
    expr = "2 + 2 * 50"
    MsgBox sc.Eval(expr)
End Sub

我认为问题在于你的
sc.Run
参数。尝试将此呼叫从

Eval = sc.Run("Result", myparams)

更新

这是一个完整的表单,使用正确编译和运行的代码:

Option Explicit On
Option Strict On

Imports MSScriptControl

Public Class Form1

    Dim sc As New ScriptControl

    Sub RunFunctions()
        MsgBox(Eval("2 * PI"))
    End Sub

    Function Eval(expr As String) As Object
        Dim code As String
        code = "Dim PI" & vbCrLf & _
               "PI = 3.1416" & vbCrLf & _
               " " & vbCrLf & _
               "Function Result" & vbCrLf & _
               "    Result = " & expr & vbCrLf & _
               "End Function"

        sc.Language = "VBScript"
        sc.AllowUI = True
        sc.AddCode(code)
        Dim myparams() As Object

        Eval = sc.Run("Result")

    End Function
    Sub SimpleTask()
        Dim expr As String
        sc.Language = "VBScript"
        expr = "2 + 2 * 50"
        MsgBox(sc.Eval(expr))
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        SimpleTask()
        RunFunctions()
    End Sub
End Class

我认为问题在于你的
sc.Run
参数。尝试将此呼叫从

Eval = sc.Run("Result", myparams)

更新

这是一个完整的表单,使用正确编译和运行的代码:

Option Explicit On
Option Strict On

Imports MSScriptControl

Public Class Form1

    Dim sc As New ScriptControl

    Sub RunFunctions()
        MsgBox(Eval("2 * PI"))
    End Sub

    Function Eval(expr As String) As Object
        Dim code As String
        code = "Dim PI" & vbCrLf & _
               "PI = 3.1416" & vbCrLf & _
               " " & vbCrLf & _
               "Function Result" & vbCrLf & _
               "    Result = " & expr & vbCrLf & _
               "End Function"

        sc.Language = "VBScript"
        sc.AllowUI = True
        sc.AddCode(code)
        Dim myparams() As Object

        Eval = sc.Run("Result")

    End Function
    Sub SimpleTask()
        Dim expr As String
        sc.Language = "VBScript"
        expr = "2 + 2 * 50"
        MsgBox(sc.Eval(expr))
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        SimpleTask()
        RunFunctions()
    End Sub
End Class

下面是VBA的最终工作代码。competent_tech有一个用于VB.Net的

Option Explicit
Dim sc As New ScriptControl

Sub RunFunctions()
    MsgBox (Eval("2 * PI"))
End Sub

Function Eval(expr As String) As String
    Dim code As String
    code = "Dim PI" & vbCrLf & _
           "PI = 3.1416" & vbCrLf & _
           " " & vbCrLf & _
           "Function Result" & vbCrLf & _
           "    Result = " & expr & vbCrLf & _
           "End Function"

    sc.Language = "VBScript"
    sc.AllowUI = True
    sc.AddCode (code)

    Eval = sc.Run("Result")

End Function

下面是VBA的最终工作代码。competent_tech有一个用于VB.Net的

Option Explicit
Dim sc As New ScriptControl

Sub RunFunctions()
    MsgBox (Eval("2 * PI"))
End Sub

Function Eval(expr As String) As String
    Dim code As String
    code = "Dim PI" & vbCrLf & _
           "PI = 3.1416" & vbCrLf & _
           " " & vbCrLf & _
           "Function Result" & vbCrLf & _
           "    Result = " & expr & vbCrLf & _
           "End Function"

    sc.Language = "VBScript"
    sc.AllowUI = True
    sc.AddCode (code)

    Eval = sc.Run("Result")

End Function

当你的手指键入“错误”或“异常”或“访问冲突”时,他们应该开始键入的下一件事是确切的错误是什么,包括任何错误消息和内存地址。写“it出错”是毫无意义的。如果你提供信息,即使信息或地址对你来说毫无意义,它也会对你请求帮助的人有用。请编辑您的问题并提供其他详细信息。谢谢。:)哦,是的,我本想把它放进去的。有一个小触发器在它之后不是“函数结果”需要()吗?(对vbscript有点生疏,所以不能100%确定如果没有参数传递,这是必须的)@Eddy我尝试添加()但没有效果。您的Eval函数返回“object”:如果确实返回,那么当您的手指键入“error”或“exception”或“access invalition”时,您需要使用
Set Eval=sc.Run(…)
,接下来,他们应该开始键入确切的错误,包括任何错误消息和内存地址。写“it出错”是毫无意义的。如果你提供信息,即使信息或地址对你来说毫无意义,它也会对你请求帮助的人有用。请编辑您的问题并提供其他详细信息。谢谢。:)哦,是的,我本想把它放进去的。有一个小触发器在它之后不是“函数结果”需要()吗?(vbscript有点生疏,所以不能100%确定如果没有参数传递,这是必须的)@Eddy我尝试添加()但没有效果。您的Eval函数返回“object”:如果确实返回,则需要使用
Set Eval=sc.Run(…)
感谢您的响应。我正在Eval=sc.Run(“结果”)上获取(对象变量或未设置块变量)。不确定脚本有什么问题。在您的答案和Tims的答案之间,我能够解决。再次感谢。@Tzoro:对不起,我完全没有注意到你在VBA中试图这么做。您在哪个VBA环境中运行此程序?这是针对SolidWorks的。在你和蒂姆之间,我能够解析并编辑原始帖子以反映。我还向使用VB.Net的用户推荐了您的答案。谢谢您的回复。我正在Eval=sc.Run(“结果”)上获取(对象变量或未设置块变量)。不确定脚本有什么问题。在您的答案和Tims的答案之间,我能够解决。再次感谢。@Tzoro:对不起,我完全没有注意到你在VBA中试图这么做。您在哪个VBA环境中运行此程序?这是针对SolidWorks的。在你和蒂姆之间,我能够解析并编辑原始帖子以反映。我还向使用VB.Net的用户推荐了您的答案。