使用连续顺序的相同值的几个单元格进行Excel插值

时间:2013-01-11 06:15:36

标签: excel vba excel-vba excel-2007

我试图插入的数据如下所示:

=X= 
0
0
0
0
0
0.5
1
3.1
5.5
6.2
8.5

=Y=
0.019607843
0.019607843
0.019607843
0.019607843
0.019607843
0.117647059
0.137254902
0.156862745
0.176470588
0.196078431
0.215686275

=Z=
0.019607843
0.039215686
0.058823529
0.078431373
0.098039216
0.117647059
0.137254902
0.156862745
0.176470588
0.196078431
0.215686275
0.235294118

我正在使用http://www.xlxtrfun.com/XlXtrFun/XlXtrFun.htm插件。在一个单元格中,我有这个插件的插值公式,除了这个特定的数据集外,它大部分时间都能正常工作。

AM1 中的

我有以下代码:

  

=内插($ F $ 2:$ F $ 51 $ d $ 2:$ d $ 51 M2,TRUE,FALSE)

其中列F是Y数据D是X数据,M是Z

问题在于,在X组数据中,连续值为0,因此在具有公式的单元格中,我得到 #NUM!

我尝试将0稍微改为0.1 0.2等,之后它正常工作,所以我知道公式是正确的,但是有了这些数据,我无法改变它,或者它会在最后彻底改变结果。那么有谁知道我可以保留这些值并保持正确插值的方法吗?

2 个答案:

答案 0 :(得分:1)

对于线性插值,我认为这个公式有效(适当时复制):

=   INDEX(F$6:F$16,MATCH(M6,D$6:D$16))+ 
(M6-INDEX(D$6:D$16,MATCH(M6,D$6:D$16)))*INDEX(F$6:F$16,MATCH(M6,D$6:D$16)+1)-  
    INDEX(F$6:F$16,MATCH(M6,D$6:D$16)))/(INDEX(D$6:D$16,MATCH(M6,D$6:D$16)+1)-  
    INDEX(D$6:D$16,MATCH(M6,D$6:D$16)))  

SO14272723 example

如果确实如此,可以完全归功于Jon Peltier(否则责备全是我的!)

答案 1 :(得分:1)

在任何情况下,如果你想尝试以上公式作为VBA功能(以保持你的表清洁)...你可以尝试以下。也许这是我不想写更多代码的一天;)所以它在我的最后工作。如果它适合你,那么所有感谢Tushar Mehta LOL我只是从@pnuts复制了那个标记行。但是在上面的网站中你有更多与interpol相关的代码。也试一试。

Option Explicit
Option Compare Text

Function RealEqual(X, Y) As Boolean
    RealEqual = Abs(X - Y) <= 0.00000001
End Function

Function LinearInterp(XVals, YVals, TargetVal)
   Dim MatchVal
   On Error GoTo ErrXit

   With Application.WorksheetFunction
    MatchVal = .Match(TargetVal, XVals, 1)
     If MatchVal = XVals.Cells.Count _
            And RealEqual(TargetVal, .Index(XVals, MatchVal)) Then
        LinearInterp = .Index(YVals, MatchVal)
     Else
        LinearInterp = .Index(YVals, MatchVal) _
            + (.Index(YVals, MatchVal + 1) - .Index(YVals, MatchVal)) _
                / (.Index(XVals, MatchVal + 1) _
                    - .Index(XVals, MatchVal)) _
                * (TargetVal - .Index(XVals, MatchVal))
     End If
   End With
    Exit Function
ErrXit:
    With Err
     LinearInterp = .Description & "(Number= " & .Number & ")"
    End With
End Function

工作表视图:

enter image description here