vba使用linest来计算多项式系数和输出索引

时间:2016-02-21 22:00:01

标签: excel vba excel-vba worksheet-function polynomials

我有两排数据,破裂压力和深度。我必须在vba中编码以生成多项式(这种情况下为二次方程)方程,然后将系数输出到工作表。我正在使用Linest和Index。对于这两行数据,我不知道我有多少数据集,因为我需要先删除一些噪声数据(噪声数据的定义是随机的,因此数据集的数量每次都不同),所以我可以&# 39;使用" A17:A80"在linest功能。但是,看起来vba中的工作表函数不适用于数组。

Dim Frac_x, Frac_y As Range
Dim X
        Set Frac_x = Range(Cells(17, 1), Cells(e - 1, 1))
        Set Frac_y = Range(Cells(17, 7), Cells(e - 1, 7))
        X= Application.WorksheetFunction.LinEst(Frac_y,Frac_x,{1,2})
        Cells(3, 8).Value = Application.WorksheetFunction.Index(X, 1, 1)
        Cells(4, 8).Value = Application.WorksheetFunction.Index(X, 1, 2)
        Cells(5, 8).Value = Application.WorksheetFunction.Index(X, 1, 3)

在此代码中,e在前面的代码中定义,(e-1)表示数据集的总数。但是,我一直收到{ is a invalid character行:X= Application.WorksheetFunction.LinEst(Frac_y,Frac_x,{1,2}) 然后我做了一些研究并将代码修改为:

Dim Frac_x, Frac_y As Range
Dim X
        Set Frac_x = Range(Cells(17, 1), Cells(e - 1, 1))
        Set Frac_y = Range(Cells(17, 7), Cells(e - 1, 7))
        X = Application.Evaluate("=linest(" & Frac_y & "," & Frac_x & "^ {1,2}))")
        Cells(3, 8).Value = Application.WorksheetFunction.Index(X, 1, 1)
        Cells(4, 8).Value = Application.WorksheetFunction.Index(X, 1, 2)
        Cells(5, 8).Value = Application.WorksheetFunction.Index(X, 1, 3)

然后我不断收到该行的Type Dismatch错误: X = Application.Evaluate("=linest(" & Frac_y & "," & Frac_x & "^ {1,2}))") 我确信两个范围frac_y和frac_x的类型匹配。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您是对的,Excel VBA无法执行arrVariable^{1,2}之类的操作。必须使用数组项上的循环来完成。

Evaluate方法应该有效。但是你的公式字符串不正确。为了检测并避免这种不正确性,我将首先在String变量中连接这些公式字符串。然后我可以简单地检查变量的值。

示例,值位于A17:A26G17:G26

Sub test()

 Dim Frac_x As Range, Frac_y As Range
 Dim X

 e = 27

 With ActiveSheet

  Set Frac_x = .Range(.Cells(17, 1), .Cells(e - 1, 1))
  Set Frac_y = .Range(.Cells(17, 7), .Cells(e - 1, 7))
  arrX = Frac_x
  ReDim arrX2(1 To UBound(arrX), 1 To 2) As Double
  For i = LBound(arrX) To UBound(arrX)
   arrX2(i, 1) = arrX(i, 1)
   arrX2(i, 2) = arrX(i, 1) * arrX(i, 1)
  Next

  X = Application.LinEst(Frac_y, arrX2)

  'sFormula = "=LINEST(" & Frac_y.Address & "," & Frac_x.Address & "^{1,2})"
  'X = Application.Evaluate(sFormula)

  .Range(.Cells(3, 8), .Cells(5, 8)).Value = Application.Transpose(X)

 End With

End Sub

提示:使用Application.LinEst代替Application.WorksheetFunction.LinEst。如果函数无法工作,后者将抛出错误,而第一个函数将返回错误值。所以第一个不会像后者那样打断程序。