【问题标题】:vba use linest to calculate polynomial coefficients and index to outputvba使用linest计算多项式系数和索引输出
【发布时间】:2016-02-21 22:00:00
【问题描述】:

我有两行数据,断裂压力和深度。我必须在 vba 中编码以生成多项式(在这种情况下为二次)方程,然后将系数输出到工作表。我正在使用 Linest 和索引。对于这两行数据,我不知道我有多少个数据集,因为我需要先删除一些噪声数据(噪声数据的定义是随机的所以数据集的数量每次都不一样),所以我不能使用像“A17:A80”这样的行函数。但是,看起来 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,2} 到底是什么意思?试试这个:X = Application.LinEst(Frac_y, Frac_x, array({1,2}))
  • 尝试将 Dim Frac_x, Frac_y As Range 更改为 Dim Frac_x as range, Frac_y As Range as first 将使 Frac_x 变暗为变体而不是范围。

标签: vba excel worksheet-function polynomials


【解决方案1】:

你是对的,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。如果函数无法工作,后者将引发错误,而第一个将返回错误值。所以前者不会像后者那样中断程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多