(812684+718459+44314)/2076/60
使用如下函数计算,为什么显示“表达式错误!”,如果是把60换成6或者600就可以
Private Function MathCalculator(ByVal 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 = MathCalculator(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
                            MathCalculator = Mid(GS, 1, Len(GS) - 1)
                            Exit Function
                        End If
                    End If
                End If
            End If
        Loop
       
err:
        MathCalculator = "表达式错误!"
            
End Function

解决方案 »

  1.   

    你把on error去掉,就知道具体哪行出错,出啥错了
      

  2.   

            Loop
            
          Exit Function'加这句
    err:
            MathCalculator = "表达式错误!"
                
    End Function
      

  3.   

    然后
    on error屏蔽掉看看
    "如果是把60换成6或者600就可以"可能是执行了
                            Else 
                                MathCalculator = Mid(GS, 1, Len(GS) - 1) 
                                Exit Function
      

  4.   

    去掉On Error也没有用。这个方法毕竟有缺陷,还是用控件msscript.ocx来计算好。 Option Explicit
    '先引用 Microsoft Script Control 1.0
    '计算(812684+718459+44314)/2076/60
    Private Function MathCalculator(strData As String) As String
            On Error GoTo Errhandle
            Dim SCobj As ScriptControl
            Set SCobj = New ScriptControl
            SCobj.Language = "VBScript"
            MathCalculator = SCobj.Eval(strData)
            Set SCobj = Nothing
            Exit Function
    Errhandle:
            If Err > 0 Then MsgBox Err.Description
    End Function
    Private Sub Command1_Click()
            Debug.Print MathCalculator("(812684+718459+44314)/2076/60")
    End Sub