我有两排数据,破裂压力和深度。我必须在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的类型匹配。有人可以帮忙吗?
答案 0 :(得分:0)
您是对的,Excel VBA无法执行arrVariable^{1,2}
之类的操作。必须使用数组项上的循环来完成。
但Evaluate
方法应该有效。但是你的公式字符串不正确。为了检测并避免这种不正确性,我将首先在String
变量中连接这些公式字符串。然后我可以简单地检查变量的值。
示例,值位于A17:A26
和G17: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
。如果函数无法工作,后者将抛出错误,而第一个函数将返回错误值。所以第一个不会像后者那样打断程序。