Excel的VBA中最基本的多项式回归

我遇到的问题在子例程中查找在Excel的VBA中使用Linest的信息。 我需要返回一列x值(列17开始在第17行)和一列y值(列G开始于第17行)的多项式系数(三阶或四阶)。

我正在使用的代码如下所示,它的工作原理。

Dim X X = Application.Evaluate("=linest(g17:g61,A17:A61^{1,2,3})") Cells(3, 8) = X(1) Cells(4, 8) = X(2) Cells(5, 8) = X(3) Cells(6, 8) = X(4) 

实质上,我需要能够使这个子程序在任何数据长度上工作。 数据将始终开始input第17行。要做到这一点,我一直在尝试使用类似于下面显示的代码。

 Range(Cells(i, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)), Range(Cells(i, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)) 

但是,当我使用类似的范围,而不是G17:G61我得到types不匹配的错误。 我不明白为什么一组单元格与G17:G61格式的一系列单元格不同。 我也尝试使用简单的Range(Cells(17,1),Cells(61,1))而不是A17:A61

我也尝试过使用"G" & 17:"G" & 61而不是G:17:G61因为我在浏览过程中看到过一些这样做,但这似乎并不能解决我的问题。

还有其他的function可能会更好吗?

请帮忙!

对你的问题的第一个评论把你放在正确的轨道上, Application.Evaluate接受一个string(你必须build立对该string范围的引用)。 第二种使用RangeCells方法创build一个对Range的对象引用,如果你想使用对象引用,而不是计算一个string,你可以将引用传递给Application.WorksheetFunction.LinEst

以下是在原始问题中使用单元格引用的示例。

 Public Sub TestLinest() Dim x Dim i as long Dim evalString As String Dim sheetDisplayName As String Dim polyOrder as string ' this is whatever the name of your sheet containing data: sheetDisplayName = "Sheet1" ' this gets the index of the last cell in the data range i = Range(sheetDisplayName & "!A17").End(xlDown).Row ' Obviously change this depending on how many polynomial terms you need polyOrder = "{1,2,3}" evalString = "=linest(" & sheetDisplayName & "!E6:E" & i & ", " & sheetDisplayName & "!D6:D" & i & "^" & polyOrder & ")" x = Application.Evaluate(evalString) Cells(3, 8) = x(1) Cells(4, 8) = x(2) Cells(5, 8) = x(3) Cells(6, 8) = x(4) End Sub 

你可以看到有几个魔术variables可以填写,范围,表格名称和多项式顺序。 也许这个例程可以扩展为将这些参数作为parameter passing给函数,并返回一系列系数?


此时可能值得一提的是,如果不使用VBA,则可以实现所有这一切,这意味着电子表格逻辑对于您和/或您的用户来说更为明显。 下面是一些示例function,使您能够在一张纸上完成所有这些操作,其要点如下:

获取填充单元格的总数(可以说这是在A1中)

 =COUNT(A17:A10000) 

input这个数组公式:

 =LINEST(INDIRECT("G17:G"&(A1+16)), INDIRECT("A17:A"&(A1+16))^{1,2,3}) 

这个公式中的16和{1,2,3}显然可以改变以适应你的情况。