VB.net | 如何在程序中执行用户脚本以及进行代数式计算

  1. 浏览更多工具栏,点“COM”选项卡,找到 ScriptControl Object 控件,添加,并拖拽一个到窗体上。
  2. 在工程项目属性中,点“程序集信息(Assembly Information)”按钮,选中“使程序集 COM 可见”。
  3. 编写代码。
代码一般是这样的:
s = ScriptControl.Eval("(90-36)*5^2")

Microsoft(R) Script 控件使用户可以创建运行任何 ActiveX(R) scripting 引擎,例如 Microsoft(R) Visual Basic 
(R) Scripting Edition 或Microsoft(R) JScript(TM) 的应用程序。用户可以将任何 Automation 对象的对象模型添加 
到 Script 控件中,这样该对象的方法和属性就可以为 scripting 引擎所使用。通过将某个应用程序的对象模型和某个 
scripting 引擎加以综合,用户就可以创建一个结合了两方面优点的 scripting 应用程序。应用程序不但具有 
scripting 语言的简单化特点,而且综合了一种更高级、具有完整特性的专业应用程序的对象、方法,以及属性。

创建 Script 控件的实例 
Microsoft Script 控件可作为一个控件或者作为一个独立的 Automation 对象创建出来。该特性可以使得用任何语言书写 
的应用程序都可以用 ScriptControl 宿主任何兼容的 scripting 语言。 
下面的示例可使用任意格式。请注意变量 sc 并未声明为类型 ScriptControl,因为该控件不是,也不必要是工程中所引 
用的。只要 Script 控件出现并进行注册,下面的代码就可正常工作:


Private Sub Command1_Click() 
Dim sc 
Dim strProgram As String 
strProgram = "Sub Main" & vbCrLf & _ 
"MsgBox ""Hello World""" & vbCrLf & _ 
"End Sub" 
Set sc = CreateObject("ScriptControl") 
sc.language = "VBScript" 
sc.addcode strProgram 
sc.run "Main" 
End Sub

如果用户在自己的工程中的引用中对 Script 控件进行显式引用,那么用户就可以用下面的代码创建 Script 控件的一个 
实例: 
Dim sc As ScriptControl

显示用户接口元素 
AllowUI 属性决定了 scripting 引擎是否可以显示用户接口元素。这可以应用于 Script 控件本身,例如显示超时消息。 
这也可以应用于使用 ActiveX scripting 接口的 scripting 引擎。例如,下面的代码将在试图显示 Hello World 消息框 
时产生一个错误: 
ScriptControl1.AllowUI = False 
Dim strX As String 
strX = "Sub Hello" & vbCrLf & _ 
"MsgBox ""Hello World""" & vbCrLf & _ 
"End Sub" 
ScriptControl1.AddCode strX 
ScriptControl1.Run "Hello" ' 没有允许的 UI!

创建 Scripting 代码 
Microsoft Script 控件使用户可以创建一个运行 scripting 语言,例如 VBScript 或 JScript 的应用程序。例如,假设 
用户在窗体上有一个按钮,用户希望在按下该按钮时运行某些 VBScript 代码。该按钮称为 Run NameMe,而用户希望 
scripting 代码运行一个叫 NameMe 的过程。意图是当用户单击 Run NameMe 按钮时,VBScript scripting 引擎执行 
NameMe 过程。 
这个 Run NameMe 按钮使用 Script Control 的 Run 方法来执行脚本。下面就是应当出现在 Run NameMe 按钮的 Click 
事件中的代码:

' Script Control 的名字是 ScriptControl1。 
Private Sub RunNameMe_Click() 
ScriptControl1.Run "NameMe" 
End Sub 
为了创建该脚本所需要代码的其余部分,请选择一种 scripting 语言,并将代码添加到某个过程中,然后运行该过程。

选择一种 Scripting 语言 
第一步是为 Script Control 配置正确的 scripting 语言。当在某页上作为控件创建 Script Control 时,Language 属 
性就被自动初始化为 "VBScript"。当作为一个 Automation 对象来创建 Script Control 时,则 Language 属性留作未初 
始化的状态,而必须由代码作者对其进行设置。

若要将 Language 属性设置为 JScript,可使用 Properties 窗口。用户也可以在代码中使用 Language 属性,如下所 
示:

ScriptControl1.Language = "JScript" 
其他 scripting 语言,例如 PERL 和 REXX,都不是由 Microsoft 所提供的,也可以为 Script 控件所用。

将代码添加到某个过程中 
在用户运行 NameMe 过程之前,可使用 AddCode 方法将完整的过程添加到 Script 控件中。如果用户试图将一个不完整的 
过程(一个没有 End Sub 或者 End Function 的过程)添加进去,则将会出错。下面的代码将过程代码添加到 Script 
Control 中:

' 当 ScriptRun 应用程序加载时,添加下面的代码 
' 将 NameMe 过程添加到 Control 中。 
Private Sub Form_Load() 
Dim strCode As String 
strCode = "Sub NameMe()" & vbCrLf & _ 
" Dim strName As String" & vbCrLf & _ 
" strName = InputBox(""Name?"")" & vbCrLf & _ 
" MsgBox ""Your name is "" & strName" & vbcrLf & _ 
"End Sub" 
ScriptControl1.AddCode strCode 
End Sub 
另外,用户也可以从某个 TextBox 控件添加过程代码: 
Private Sub Form_Load() 
' 该代码包含在名为 frmScript 的窗体上 
' 名为 txtScript 的 Textbox中。 
ScriptControl1.AddCode frmScript.txtScript.Text 
End Sub 
用户可以将参数添加到某个过程或者函数中。 
Private Sub EvalFunc() 
' 创建函数。 
Dim strFunction As String 
strFunction = _ 
"Function ReturnThis(x, y)" & vbCrLf & _ 
" ReturnThis = x * y" & vbCrLf & _ 
"End Function" 
' 添加代码,然后运行该函数。 
ScriptControl1.AddCode strFunction 
MsgBox ScriptControl1.Run("ReturnThis", 3, 25) 
End Sub 
运行过程 
Run 方法运行任何已被添加到 Script 控件中的完整过程。下面的代码段运行三个已定义过程:

ScriptControl1.Run "FindName" 
ScriptControl1.Run "AddName" 
ScriptControl1.Run "Quit"

执行 Scripting 语句,并计算结果 
用户可以用 ExecuteStatement 方法执行一条 scripting 语句。用户可以用 eval 方法计算某个表达式值。在下面的示例 
中,用 ExecuteStatement 方法将值 100 赋给变量 x。下面的两行用 eval 方法来测试语句 x = 100 和 x = 100/2。第 
二行返回 True;而第三行则返回 False。 
Private Sub TryThis() 
ScriptControl1.ExecuteStatement "x = 100" 
MsgBox ScriptControl1.Eval("x = 100") ' 返回 True 
MsgBox ScriptControl1.Eval("x = 100/2") ' 返回 False 
End Sub 
使用 Error 属性 
Script 控件错误有两个可能来源:Script 控件自身,或者该控件试图运行的 script。为了对 scripting 代码进行调 
试,可使用 Error 属性,该属性返回对 Error 对象的引用。利用 Error 对象,Script 控件可以返回错误数目和对它的 
描述,以及错误在 script 中出现的行号。 
运行下面的代码,查看 Script 控件发现错误的一个示例:

Private Sub MyError() 
' 下面的代码被零除导致 
' 一个错误。 
Dim strCode As String 
strCode = _ 
"Sub DivideByZero()" & vbCrLf & _ 
"Dim prime" & vbCrLf & _ 
"prime = 3" & vbCrLf & _ 
"MsgBox prime/0" & vbCrLf & _ 
"End Sub" 
On Error GoTo scError 
With ScriptControl1 
.AddCode strCode 
.Run "DivideByZero" 
End With 
Exit Sub 
scError: 
' 使用 Error 对象向用户通告 
' 错误,以及出错行。 
Debug.Print ScriptControl1.Error.Number & _ 
":" & ScriptControl1.Error.Description & _ 
" in line " & ScriptControl1.Error.Line 
Exit Sub 
End Sub

实例:单元格a2开始的a列各单元格中填有不同数字, 每二个数字间空一格,现要求去除单元格中的重复数字后并按升序排列到从b2开始的b列,每二个数字间空一格。
如:单元格a2中填有数字7 1 2 3 5 1 3 5 7 , 重复数字1,3 ,5 ,7只保留一个 后为1 2 3 5 7,即单元格b2为:1 2 3 5 7

Sub ReSrt()
    Dim Arr, k%
    Dim oJs As Object
    
    Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
    oJs.eval "function getlst(str){return str.match(/\d+/g).sort(cmpr).join(' ').replace(/(\d+)(\s\1)\2{0,}/g,'$1');} " _
            & "function cmpr(a,b){return a-b;}"
    
    Arr = [A1].CurrentRegion
    For k = 2 To UBound(Arr)
        Arr(k, 2) = oJs.codeobject.getlst(Arr(k, 1))
    Next
    [A1].Resize(k - 1, 2) = Arr
    Set oJs = Nothing
End Sub


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
表达式计算说明 很久就想编一个这样的计算器,只可惜一直没什么思路,最近突然灵感来了,所以就写下 这个程序。现在还在测试阶段,所以功能不是很完善。 程序功能:基本的表达式运算,可以自定义函数跟常量,分别保存在 “常数.txt” 和 “函数.txt”,方便自己添加。双击相应的函数名或常数名就可以将函数或常量添加到表达式计算过程只能当表达式只有一行时有效。 实例1:计算sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 计算过程sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-8))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*17)/2 =20.3032618253667/2 =10.1516309126834 实例2:计算 a=34 b=55 c=a+1 圆的面积(c) a*b c=a+b 圆的面积(c) 以下是计算结果: 圆的面积(c)=3848.4510006475 a*b=1870 圆的面积(c)=24884.5554090847 内置函数: !(x) - x 的阶乘 lg(x),log(x) 以10为底的对数 ln(x) 以 e为底x的对数 pow(x,y) x的y方次幂 prime(x) 判定x是否是素数,如果是直接将s2返回,否则将其各因子用连乘返回 sqr(x),sqrt(x) - x 的二次方根 arcsin(x) - x 的反正弦 arccos(x) - x 的反余弦 arcsec(x) - x 的反正割 arccsc(x) - x 的反余割 atn(x),arctg(x) - x 的反正切 arcctg(x) - x 的反余切 sin(x) - x 的正弦 cos(x) - x 的余弦 sec(x) - x 的正割 csc(x) - x 的余割 tg(x),tan(x) - x 的正切 ctg(x) - x 的余切 harcsin(x) - x 的反双曲正弦 harccos(x) - x 的反双曲余弦 harcsec(x) - x 的反双曲正割 harccsc(x) - x 的反双曲余割 harctg(x),harctan(x) - x 的反双曲正切 harcctg(x) - x 的反双曲余切 hsin(x) - x 的双曲正弦 hcos(x) - x 的双曲余弦 hsec(x) - x 的双曲正割 hcsc(x) - x 的双曲余割 htg(x),htan(x) - x 的双曲正切 hctg(x) - x 的双曲余切 有什么意见或建议可以跟我联系Email: ldm.menglv@gmail.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值