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

时间:2014-07-20 10:08:04

标签: excel vba excel-vba trendline

所以这是我的情况:

我有大量数据,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  m   c
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

如果有人可以提供帮助,我们将不胜感激!!

1 个答案:

答案 0 :(得分:1)

这是使用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”系数是什么意思,因为在我的Excel版本的LINEST帮助中没有描述。但是你应该能够从该文件中找出它并返回值的描述。

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