使用VBA复制单元格并删除空白,然后使用Linest()

所以这是我的情况:

我有大量的数据,x值为1-18,但y值不同。其中一些是空白,因为方程是/ 0 – 排列成行。

我试图得到y值的每一行多项式趋势线的m ^ 3,m ^ 2,m,c系数.. y1,y2等

因为我不能使用Linest()与空白我试图使用VBA复制出所有相关的(非空白)Y值,但也删除该行的关联的X值。

这里是数据的一个例子部分 – 但是还有更多的行

x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 m3 m2 mc y1 0.0 1.0 2.0 2.0 1.0 0.0 1.0 - 2.0 2.0 1.0 2.0 2.5 1.0 1.0 2.0 1.0 4.0 ? ? ? ? y2 0.0 1.0 - 2.0 2.0 0.0 2.0 2.0 0.0 1.7 4.0 1.0 2.0 2.0 4.0 1.0 3.0 2.0 ? ? ? ? 

到目前为止,我一直在尝试没有太多的成功。

到目前为止,我一直在尝试这样的事情,但没有成功,但这是我第一次VBA尝试..所以对不起,如果我不知道明显的!

 'code to identify known_y and known_x ranges For each testvalue in known_y If testvalue indicates that this point should be included in regression then copy this data point (both known_y and known_x value for this point) either into an array (if I want to invoke LINEST() from within VBA) or into another range in the spreadsheet. Next testvalue Invoke LINEST() using the copied data 

如果任何人都可以帮助,将不胜感激!

这是使用VBA的一种方法。 既然你开始寻找m3,我假设这是一个三阶多项式。 无论如何,在UDF myPolyLinest中,“order”是一个名为“maxPower”的参数,除此之外,它与工作表函数类似,并返回相同的结果数组,它过滤掉没有数字的列值,它为每个Y值单独做。

工作表上的公式如下所示:

 m3: =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,1) m2: =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,2) m1 =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,2) 

其中INDEX函数的参数用于返回所需的值我不确定您的意思是“c”系数,因为LINEST帮助中没有描述我的Excel版本。 但是你应该能够从这个文件和返回值的描述中弄清楚。

 Option Explicit Function myPolyLinest(knownYs As Range, knownXs As Range, Optional maxPower As Long = 1, _ Optional notForceZero As Variant = True, Optional Stats As Variant = False) As Variant Dim vX As Variant, vY As Variant Dim I As Long Dim J As Long Dim colXY As Collection vX = knownXs vY = knownYs Set colXY = New Collection For I = 1 To UBound(vX, 1) For J = 1 To UBound(vX, 2) If Not IsError(vY(I, J)) Then If vX(I, J) <> "" And vY(I, J) <> "" And _ IsNumeric(vX(I, J)) And IsNumeric(vY(I, J)) Then colXY.Add Array(vX(I, J), vY(I, J)) End If End If Next J Next I ReDim vX(1 To colXY.Count, 1 To maxPower) ReDim vY(1 To colXY.Count, 1 To 1) For I = 1 To colXY.Count For J = 1 To maxPower vX(I, J) = colXY(I)(0) ^ (J) Next J vY(I, 1) = colXY(I)(1) Next I myPolyLinest = WorksheetFunction.LinEst(vY, vX, notForceZero, Stats) End Function