2

補間しようとしているデータは次のようになります。

=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には、次のコードがあります。

=Interpolate($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 などに少し変更してみました。その後、正しく機能するので、式が正しいことがわかりますが、このデータでは変更できないか、最終的に結果が大幅に変わります。これらの値を維持し、正しい補間を維持する方法を知っている人はいますか?

4

2 に答える 2

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

シート ビュー:

ここに画像の説明を入力

于 2013-01-11T19:28:14.920 に答える
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 の例

もしそうなら、 Jon Peltierの功績を称えます (そうでなければ責任はすべて私にあります!)

于 2013-01-11T14:58:28.500 に答える