如:
dim a as interger,b as interger,c as string
a=1
b=2
c="a+b"
msgbox 『』
现在我想通过我事先存储在变量c中的表达式,并且计算它,最后得到结果3.

解决方案 »

  1.   

    dim a as interger,b as interger,c as string
    a=1
    b=2
    c=a + b
    msgbox c
    '这样是可以实现你的想法但是如果按照你的所想,把字符串表达式变成数学表达式
    然后再算出它的值,那就比较麻烦,首先没有直接转换的
    方法,想实现只有通过你的算法对字符串加以判断分解然
    后再算出它的值。
      

  2.   

    楼主的想法比较有利于学习,一般数值型数字和字符型数字的概念
    比如dim x as integer
    dim y as string
    x=10
    y="10"
    '再c++中这样的转换比VB要复杂,搞清楚对你很有帮助
      

  3.   

    ScriptControl控件的Eval 方法
      

  4.   

    Private Sub Form_Load()
    Dim a As Integer, b As Integer, c As String
    a = 1
    b = 2
    c = "a+b"
     x = Split(c, "+")
    x(0) = a
    x(1) = b
    MsgBox Val(x(0)) + Val(x(1))End Sub
      

  5.   

    事实上字符串中只有字符,不存在计算式,c="a+b"返回的就是字符a+b,不给重新赋值C永远是字串a+b,不是代数式
      

  6.   

    事实上,你用 Eval 也不好使.因为 Script 里面的参数与 VB 里面的不共用.
      

  7.   

    不用eval就用ExecuteStatement或run吧
      

  8.   

    '拷贝即可使用Public Function calu(GS As String) As String
        Dim i, n As Integer
        Dim TempGs, Temp As String
        Dim Vl() As String '操作数
        Dim Vls As Integer '操作数的数目
        Dim Si As Integer '上一操作符的位置
         Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer     '操作符的数目
        Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
        Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
        Dim Sig() As Integer '每一个操作符的位置    On Error GoTo Err
        Do While True
            ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)), Lkp(Len(GS)), Rkp(Len(GS)) As Integer
            ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)), Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
            ReDim Vl(Len(GS))
            If Len(GS) = 0 Then GoTo Err
            If Mid(GS, Len(GS), 1) <> "#" Then
               TempGs = GS
               For i = 1 To Len(GS) '将减化加
                   If Mid(GS, i, 1) = "-" And i <> 1 Then
                      If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _
                         And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then
                         TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i)
                         n = n + 1
                      End If
                   End If
               Next i
               GS = TempGs
               n = 0
               For i = 1 To Len(GS) '处理负负得正
                   If Mid(GS, i, 1) = "-" Then
                      If Mid(GS, i + 1, 1) = "-" Then
                         TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2)
                         n = n + 2
                      End If
                   End If
               Next i
               GS = TempGs
               GS = GS + "#"
            End If
            Vls = 1
            Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
            For i = 1 To Len(GS)
                Select Case Mid(GS, i, 1)
                       Case "+"
                            Ads = Ads + 1
                            Adp(Ads) = i
                            Adn(Ads) = Vls
                       Case "*"
                            Mus = Mus + 1
                            Mup(Mus) = i
                            Mun(Mus) = Vls
                       Case "/"
                            Bys = Bys + 1
                            Byp(Bys) = i
                            Byn(Bys) = Vls
                       Case "("
                            Lks = Lks + 1
                            Lkp(Lks) = i
                       Case ")"
                            Rks = Rks + 1
                            Rkp(Rks) = i
                End Select
                If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
                   If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" Then '操作符非法连续或以操作符开头
                      GoTo Err
                   Else
                      Si = i
                   End If
                   If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" Then '操作数不是数字
                      GoTo Err
                   End If
                   Sig(Vls) = i
                   Vls = Vls + 1
                Else
                   If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then
                      Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数
                   Else
                      If i <> 1 Then
                         If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _
                            (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _
                            Then '判定括号前后符号的合法性
                            GoTo Err
                         End If
                      End If
                   End If
                End If
            Next i
            If Lks <> Rks Then
               GoTo Err '左右括号数是否匹配
            End If
            For i = 1 To Lks
                If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误
            Next i
            
            If Lks <> 0 Then '括号处理
               Do While True
                  For i = Lks To 1 Step -1
                      For n = Rks To 1 Step -1
                          Temp = calu(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
                          If Temp <> "公式有错误" Then
                             GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1)
                             Exit Do
                          End If
                     Next n
                  Next i
                  If Temp = "公式有错误" Then GoTo Err
                     '括号中有错误退出
               Loop
            Else
               If Mus <> 0 Then '乘法处理
                  GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _
                       * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _
                       + 1)) + 1)
               Else
                  If Bys <> 0 Then '除法处理
                     GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _
                          / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _
                          + 1)) + 1)
                  Else
                     If Ads <> 0 Then '加法处理
                        GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _
                             + Len(Vl(2)) + 1)
                     Else
                        calu = Mid(GS, 1, Len(GS) - 1)
                        Exit Function
                     End If
                  End If
               End If
            End If
        Loop
    Err:
            calu = "公式有错误"
    End Function
    Private Sub Command1_Click()
            Dim a As Long, b As Long, c As String
            a = 1
            b = 2
            c = a + b              '此处想是什么表达式都可以
            'c = a + b + b + a + b   
            MsgBox calu(c)
    End Sub
      

  9.   

    '纠正了9楼的错误,  拷贝即可使用 Public Function calu(GS As String) As String 
        Dim i, n As Integer 
        Dim TempGs, Temp As String 
        Dim Vl() As String '操作数 
        Dim Vls As Integer '操作数的数目 
        Dim Si As Integer '上一操作符的位置 
        Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer    '操作符的数目 
        Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置 
        Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序 
        Dim Sig() As Integer '每一个操作符的位置     On Error GoTo Err 
        Do While True 
            ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)), Lkp(Len(GS)), Rkp(Len(GS)) As Integer 
            ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)), Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer 
            ReDim Vl(Len(GS)) 
            If Len(GS) = 0 Then GoTo Err 
            If Mid(GS, Len(GS), 1) <> "#" Then 
              TempGs = GS 
              For i = 1 To Len(GS) '将减化加 
                  If Mid(GS, i, 1) = "-" And i <> 1 Then 
                      If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _ 
                        And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then 
                        TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i) 
                        n = n + 1 
                      End If 
                  End If 
              Next i 
              GS = TempGs 
              n = 0 
              For i = 1 To Len(GS) '处理负负得正 
                  If Mid(GS, i, 1) = "-" Then 
                      If Mid(GS, i + 1, 1) = "-" Then 
                        TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2) 
                        n = n + 2 
                      End If 
                  End If 
              Next i 
              GS = TempGs 
              GS = GS + "#" 
            End If 
            Vls = 1 
            Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0 
            For i = 1 To Len(GS) 
                Select Case Mid(GS, i, 1) 
                      Case "+" 
                            Ads = Ads + 1 
                            Adp(Ads) = i 
                            Adn(Ads) = Vls 
                      Case "*" 
                            Mus = Mus + 1 
                            Mup(Mus) = i 
                            Mun(Mus) = Vls 
                      Case "/" 
                            Bys = Bys + 1 
                            Byp(Bys) = i 
                            Byn(Bys) = Vls 
                      Case "(" 
                            Lks = Lks + 1 
                            Lkp(Lks) = i 
                      Case ")" 
                            Rks = Rks + 1 
                            Rkp(Rks) = i 
                End Select 
                If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then 
                  If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" Then '操作符非法连续或以操作符开头 
                      GoTo Err 
                  Else 
                      Si = i 
                  End If 
                  If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" Then '操作数不是数字 
                      GoTo Err 
                  End If 
                  Sig(Vls) = i 
                  Vls = Vls + 1 
                Else 
                  If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then 
                      Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数 
                  Else 
                      If i <> 1 Then 
                        If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _ 
                            (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _ 
                            Then '判定括号前后符号的合法性 
                            GoTo Err 
                        End If 
                      End If 
                  End If 
                End If 
            Next i 
            If Lks <> Rks Then 
              GoTo Err '左右括号数是否匹配 
            End If 
            For i = 1 To Lks 
                If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误 
            Next i 
            
            If Lks <> 0 Then '括号处理 
              Do While True 
                  For i = Lks To 1 Step -1 
                      For n = Rks To 1 Step -1 
                          Temp = calu(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1)) 
                          If Temp <> "公式有错误" Then 
                            GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1) 
                            Exit Do 
                          End If 
                    Next n 
                  Next i 
                  If Temp = "公式有错误" Then GoTo Err 
                    '括号中有错误退出 
              Loop 
            Else 
              If Mus <> 0 Then '乘法处理 
                  GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _ 
                      * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _ 
                      + 1)) + 1) 
              Else 
                  If Bys <> 0 Then '除法处理 
                    GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _ 
                          / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _ 
                          + 1)) + 1) 
                  Else 
                    If Ads <> 0 Then '加法处理 
                        GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _ 
                            + Len(Vl(2)) + 1) 
                    Else 
                        calu = Mid(GS, 1, Len(GS) - 1) 
                        Exit Function 
                    End If 
                  End If 
              End If 
            End If 
        Loop 
    Err: 
            calu = "公式有错误" 
    End Function 
    Private Sub Command1_Click() 
            Dim a As Long, b As Long
            a = 1 
            b = 2         MsgBox calu(a + b)                     '此处想是什么表达式都可以 
             MsgBox calu((a + b) + b + (a + 3) * b)
    End Sub 
      

  10.   

    如果 a + b 是个字符 "a+b" 加上了引号怎么办呢?LZ的好象是加上了引号的.不加引号的.,还用这么麻烦吗?
      

  11.   

    '楼主的表达式不能是变量表达式,现实生活中也只是输入数值(比如运算器),输入带数值和运算符的表达式
    '纠正了10楼的错误,  拷贝即可使用Public Function calu(GS As String) As String
        Dim i, n As Integer
        Dim TempGs, Temp As String
        Dim Vl() As String '操作数
        Dim Vls As Integer '操作数的数目
        Dim Si As Integer '上一操作符的位置
        Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer    '操作符的数目
        Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
        Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
        Dim Sig() As Integer '每一个操作符的位置    On Error GoTo Err
        Do While True
            ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)), Lkp(Len(GS)), Rkp(Len(GS)) As Integer
            ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)), Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
            ReDim Vl(Len(GS))
            If Len(GS) = 0 Then GoTo Err
            If Mid(GS, Len(GS), 1) <> "#" Then
              TempGs = GS
              For i = 1 To Len(GS) '将减化加
                  If Mid(GS, i, 1) = "-" And i <> 1 Then
                      If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _
                        And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then
                        TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i)
                        n = n + 1
                      End If
                  End If
              Next i
              GS = TempGs
              n = 0
              For i = 1 To Len(GS) '处理负负得正
                  If Mid(GS, i, 1) = "-" Then
                      If Mid(GS, i + 1, 1) = "-" Then
                        TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2)
                        n = n + 2
                      End If
                  End If
              Next i
              GS = TempGs
              GS = GS + "#"
            End If
            Vls = 1
            Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
            For i = 1 To Len(GS)
                Select Case Mid(GS, i, 1)
                      Case "+"
                            Ads = Ads + 1
                            Adp(Ads) = i
                            Adn(Ads) = Vls
                      Case "*"
                            Mus = Mus + 1
                            Mup(Mus) = i
                            Mun(Mus) = Vls
                      Case "/"
                            Bys = Bys + 1
                            Byp(Bys) = i
                            Byn(Bys) = Vls
                      Case "("
                            Lks = Lks + 1
                            Lkp(Lks) = i
                      Case ")"
                            Rks = Rks + 1
                            Rkp(Rks) = i
                End Select
                If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
                  If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" Then '操作符非法连续或以操作符开头
                      GoTo Err
                  Else
                      Si = i
                  End If
                  If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" Then '操作数不是数字
                      GoTo Err
                  End If
                  Sig(Vls) = i
                  Vls = Vls + 1
                Else
                  If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then
                      Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数
                  Else
                      If i <> 1 Then
                        If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _
                            (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _
                            Then '判定括号前后符号的合法性
                            GoTo Err
                        End If
                      End If
                  End If
                End If
            Next i
            If Lks <> Rks Then
              GoTo Err '左右括号数是否匹配
            End If
            For i = 1 To Lks
                If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误
            Next i
            
            If Lks <> 0 Then '括号处理
              Do While True
                  For i = Lks To 1 Step -1
                      For n = Rks To 1 Step -1
                          Temp = calu(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
                          If Temp <> "公式有错误" Then
                            GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1)
                            Exit Do
                          End If
                    Next n
                  Next i
                  If Temp = "公式有错误" Then GoTo Err
                    '括号中有错误退出
              Loop
            Else
              If Mus <> 0 Then '乘法处理
                  GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _
                      * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _
                      + 1)) + 1)
              Else
                  If Bys <> 0 Then '除法处理
                    GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _
                          / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _
                          + 1)) + 1)
                  Else
                    If Ads <> 0 Then '加法处理
                        GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _
                            + Len(Vl(2)) + 1)
                    Else
                        calu = Mid(GS, 1, Len(GS) - 1)
                        Exit Function
                    End If
                  End If
              End If
            End If
        Loop
    Err:
            calu = "公式有错误"
    End Function
    Private Sub Command1_Click()
            Dim c As String
            'c = "2+3"
            c = "(2+3)+4+(2+3)*5"
            MsgBox calu(c)      '此处想是什么表达式都可以,但必须是数值表达式(相当于一个多功能的计算器)
    End Sub
      

  12.   

    '楼主的表达式好像不能是变量表达式,现实生活中也只是输入数值(比如运算器),输入带数值和运算符的表达式
    '纠正了10楼的错误,  拷贝即可使用Public Function calu(GS As String) As String
        Dim i, n As Integer
        Dim TempGs, Temp As String
        Dim Vl() As String '操作数
        Dim Vls As Integer '操作数的数目
        Dim Si As Integer '上一操作符的位置
        Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer    '操作符的数目
        Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
        Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
        Dim Sig() As Integer '每一个操作符的位置    On Error GoTo Err
        Do While True
            ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)), Lkp(Len(GS)), Rkp(Len(GS)) As Integer
            ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)), Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
            ReDim Vl(Len(GS))
            If Len(GS) = 0 Then GoTo Err
            If Mid(GS, Len(GS), 1) <> "#" Then
              TempGs = GS
              For i = 1 To Len(GS) '将减化加
                  If Mid(GS, i, 1) = "-" And i <> 1 Then
                      If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _
                        And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then
                        TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i)
                        n = n + 1
                      End If
                  End If
              Next i
              GS = TempGs
              n = 0
              For i = 1 To Len(GS) '处理负负得正
                  If Mid(GS, i, 1) = "-" Then
                      If Mid(GS, i + 1, 1) = "-" Then
                        TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2)
                        n = n + 2
                      End If
                  End If
              Next i
              GS = TempGs
              GS = GS + "#"
            End If
            Vls = 1
            Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
            For i = 1 To Len(GS)
                Select Case Mid(GS, i, 1)
                      Case "+"
                            Ads = Ads + 1
                            Adp(Ads) = i
                            Adn(Ads) = Vls
                      Case "*"
                            Mus = Mus + 1
                            Mup(Mus) = i
                            Mun(Mus) = Vls
                      Case "/"
                            Bys = Bys + 1
                            Byp(Bys) = i
                            Byn(Bys) = Vls
                      Case "("
                            Lks = Lks + 1
                            Lkp(Lks) = i
                      Case ")"
                            Rks = Rks + 1
                            Rkp(Rks) = i
                End Select
                If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
                  If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" Then '操作符非法连续或以操作符开头
                      GoTo Err
                  Else
                      Si = i
                  End If
                  If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" Then '操作数不是数字
                      GoTo Err
                  End If
                  Sig(Vls) = i
                  Vls = Vls + 1
                Else
                  If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then
                      Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数
                  Else
                      If i <> 1 Then
                        If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _
                            (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _
                            Then '判定括号前后符号的合法性
                            GoTo Err
                        End If
                      End If
                  End If
                End If
            Next i
            If Lks <> Rks Then
              GoTo Err '左右括号数是否匹配
            End If
            For i = 1 To Lks
                If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误
            Next i
            
            If Lks <> 0 Then '括号处理
              Do While True
                  For i = Lks To 1 Step -1
                      For n = Rks To 1 Step -1
                          Temp = calu(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
                          If Temp <> "公式有错误" Then
                            GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1)
                            Exit Do
                          End If
                    Next n
                  Next i
                  If Temp = "公式有错误" Then GoTo Err
                    '括号中有错误退出
              Loop
            Else
              If Mus <> 0 Then '乘法处理
                  GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _
                      * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _
                      + 1)) + 1)
              Else
                  If Bys <> 0 Then '除法处理
                    GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _
                          / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _
                          + 1)) + 1)
                  Else
                    If Ads <> 0 Then '加法处理
                        GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _
                            + Len(Vl(2)) + 1)
                    Else
                        calu = Mid(GS, 1, Len(GS) - 1)
                        Exit Function
                    End If
                  End If
              End If
            End If
        Loop
    Err:
            calu = "公式有错误"
    End Function
    Private Sub Command1_Click()
            Dim c As String
            'c = "2+3"
            c = "(2+3)+4+(2+3)*5"
            MsgBox calu(c)      '此处想是什么表达式都可以,但必须是数值表达式(相当于一个多功能的计算器)
    End Sub
      

  13.   

    'calu 为上面提到的子程序Private Sub Command1_Click()
            Dim c As String
            'c = "2+3"
            c = "(2+3)+4+(2+3)*5"
            MsgBox calu(c)      '此处想是什么表达式都可以,但必须是数值表达式(相当于一个多功能的计算器)
    End Sub
      

  14.   

    谢谢大家这么热心!我是想生成一个句子,生成该句子时是通过我事先存储在数据库中的公式(即规则,且该规则可以让用户自定义)得到的: 被处罚资料:张三,男,1981年01月01日生,河北省石家庄人。
    这时数据库中的公式便为:"被处罚人资料" & name & "," & sex & "," & birthday & ”,“ & address & "。"
    如果公式变为::"被处罚人资料" & name & "," & sex & "," & birthday & ”。"    则得到的语句变为 :被处罚资料:张三,男,1981年01月01日生。但是,我从数据库中提出规则:::"被处罚人资料" & name & "," & sex & "," & birthday & ”。"    ,但是没办法把他变成一个有效的vb表达式来执行