2014-05-05 39 views
2

我已经在一个字符串方程求解X

y = 18774x + 82795 

下列公式求解x我这样做: -

x = (y-82795)/18774 

我知道y

值然而公式总是变化并始终为字符串格式

是否有可能简单地将原始方程式抛入Evaluate语句并自动求解x?

我知道我可以做这样的事情: -

MsgBox Evaluate("5*(8+3)-2*(3*5)") 

但对我来说这将是

MsgBox Evaluate("67657657 = 18774x + 82795") 

其中y = 67657657

这显然会引发错误。有没有简单的方法可以解决x

否则我需要解析字符串多手工做出来

+0

是方程始终形式的** Y = A * X + B ** –

+0

是的,总是以这种形式出现 – David

+0

公式来自哪里?就像是从回归分析中可以直接得到系数并避免字符串。 – ja72

回答

1

A1将字符串:

Y = 18774x + 82795

A2地方在y -value:

67657657 

然后试试这个宏:

Sub Zolver() 
    Dim sTr As String, X As Double 
    Dim A As Double, B As Double, Y As Double 
    sTr = Range("A1").Value 
    sTr = Replace(sTr, " ", "") 
    sTr = Replace(sTr, "x", "") 
    sTr = Replace(sTr, "y=", "") 
    sTr = Replace(sTr, "+", ",") 
    A = CDbl(Split(sTr, ",")(0)) 
    B = CDbl(Split(sTr, ",")(1)) 
    Y = CDbl(Range("A2").Value) 
    X = (Y - B)/A 
    MsgBox X 
End Sub 
+0

选择这个,因为这是我最终使用的 – David

+0

根据原始文章,'Y'应该从单元格“A1”中提取,因为给定表达式的形式为'29394 = 6253x + 82373'。 – ja72

+0

如果用户输入'y = 27263 + 29038x',该怎么办?这将失败。看看我的答案是更强大的解决方案。 – ja72

2

试试这个:

Public Function SolveEquation(ByVal eq As String) As Double 
    Dim i_eq As Integer, y As Double 
    ' eq : "67657657 = 18774x+82795" 
    i_eq = InStr(1, eq, "=") 
    y = 0# 
    If i_eq > 0 Then 
     y = Application.Evaluate(Trim(Left(eq, i_eq - 1))) 
     'y =67657657 
     eq = Trim(Mid(eq, i_eq + 1)) 
    End If 

    Dim eq_1 As String, eq_2 As String 
    Dim x_1 As Double, x_2 As Double 
    Dim y_1 As Double, y_2 As Double 
    x_1 = 0#: x_2 = 1# 
    eq_1 = Replace(eq, "x", "*(" & CStr(x_1) & ")") 
    y_1 = Application.Evaluate(eq_1) 
    eq_2 = Replace(eq, "x", "*(" & CStr(x_2) & ")") 
    y_2 = Application.Evaluate(eq_2) 
    ' y_1 = 82795, y_2 = 101569 

    ' Alternative solution from evaluation points 
    ' SolveEquation = x_1 + (x_2-x_1)/(y_2-y_1)*(y-y_1) 

    ' y = a*x+b 
    Dim a As Double, b As Double 
    a = (y_2 - y_1)/(x_2 - x_1) 
    b = y_1 - a * x_1 
    ' a= 18774, b = 82795 

    ' Solution from linear form y = a*x+b 
    SolveEquation = (y - b)/a 
    ' 3599.38542665388 

End Function 
+0

Up vote as as I like this too too – David

+0

更强大的解决方案是将'y'结合到方程的同一侧的'b'并求解'a * x + b = 0'。这将处理左侧存在'x'的情况,例如'1 + 100x = 20x + 50'。还需要更好地处理存在或隐含'*'的情况。 – ja72

0

鉴于你是求解线性方程组:

Sub Extract() 
Dim strFunc As String 
Dim X(1 To 2) As Variant 
Dim Y(1 To 2) As Variant 
Dim C As Variant 
X(1) = 0 
X(2) = 100 
strFunc = "18774x + 82795" 
Y(1) = Evaluate(Replace(LCase$(strFunc), "x", X(1))) 
Y(2) = Evaluate(Replace(LCase$(strFunc), "x", X(2))) 
C = Application.WorksheetFunction.LinEst(Y, X) 
MsgBox "K is " & C(1) & vbNewLine & "M is " & C(2) 
End Sub