Vb.net VBA中的MS脚本控件
我通常使用VB.Net进行编程,但我被委派到一个VBA项目,该项目将受益于使用脚本控件运行脚本。下面是示例代码,但在代码的.Run行中出现错误。我可以在VB.Net中轻松完成这项工作,但无法在vba中实现 错误=参数数目错误或属性赋值无效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)
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的用户推荐了您的答案。