小美菜 发表于 2005-1-2 23:47:00

如何用VBA把字符串表达式转换成计算式?

如何用VBA把字符串表达式转换成计算式:


如:"L=Sqr(A*A+B*B)+C*(25+D)-(V-15)*(H+3)"转换成L=Sqr(A*A+B*B)+C*(25+D)-(V-15)*(H+3)

tfyyf 发表于 2005-1-3 07:36:00

这个我也想知道。

小美菜 发表于 2005-1-9 22:37:00

没有知道的吗?

雪山飞狐_lzh 发表于 2005-1-10 22:38:00

用ScriptControl控件可以解析

tfyyf 发表于 2005-1-11 14:40:00

版主能否给个实例?

clement 发表于 2005-1-11 18:09:00

本帖最后由 作者 于 2005-1-11 19:12:07 编辑 <br /><br /> Script对象的属性、方法、事件 <BR>Script是作为一个ActiveX控件提供给用户的,在利用它之前,我们来看一看此控件的属性和方法。


属性:


AllowUI:可读写,布尔值,检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面元素不可见。


CodeObject:返回宿主被调用的特定的公用成员对象。只读。


Modules:只读。返回宿主提供给脚本的组件库模块。COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules(模块)。


Language:设置或获取脚本引擎解释的语言,例如:VBScript、JScript。


Name:返回模块、过程、或者对象的名字,只读属性。


Procedures:返回模块中定义的过程,只读。


SitehWnd:窗口句柄,如果本控件以ActiveX控件创建,则此属性为控件的容器;如果是以自动化对象创建,则为0,即桌面。此属性可读写。


State:设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。


Timeout:设置或返回控件的相应脚本的超时值。当超时值到达时,将引发Timeout事件。也可设为-1,表示无超时设定。


UseSafeSubset:设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置。


Error:错误对象,发生错误时,此属性返回一个错误对象。


方法:


AddCode :往一个模块加入一些代码。格式为:AddCode code, 可以调用多次。


AddObject:向一个模块加入一个对象,格式:ScriptControl.AddObject(name, object[, addMembers]),name为欲加入的对象名字,Object为实际的对象,addMembers为可选指示此对象是否为全局对象,False为局部对象。只有往本对象中加入对象后才能在脚本中使用这些对象。


Eval:求值表达式。格式为object.Eval(expression) 。


ExecuteStatement:解释并执行脚本语句。格式:object.ExecuteStatement statement。


Reset:丢弃所有的对象和代码。State属性将为0。


Run:运行一个指定的过程。格式:object.Run(procedureName, parameters()),procedureName为要运行的过程名,parameters()为


事件


仅有两个事件:error 和TimeOut。前者可以用于错误捕获,后者在脚本得不到响应时发生。

雪山飞狐_lzh 发表于 2005-1-11 18:24:00

<FONT face=宋体 size=2>Dim a As Object<BR>Set a = CreateObject("ScriptControl")<BR>a.language = "vbs"<BR>a.ExecuteStatement "a=1"<BR>a.ExecuteStatement "b=2"<BR>MsgBox a.eval("a+b")</FONT>

clement 发表于 2005-1-11 19:41:00

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


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


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


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


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


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


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


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


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


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


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


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


ScriptControl1.Run "FindName" <BR>ScriptControl1.Run "AddName" <BR>ScriptControl1.Run "Quit"


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


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

tfyyf 发表于 2005-1-12 07:12:00

明白了,谢谢!
页: [1]
查看完整版本: 如何用VBA把字符串表达式转换成计算式?