hi!
As I have posted earlier, interpolation is complicated algorithm in numerical anlysis. But more or less I have one code in here. this uses the spline method of interpolation.
This has a very high acuraccy on values within the given data.
I have not fully tested this on values outside it.
see below.
the code..........<font face=Courier New><SPAN style="color:#00007F">Dim</SPAN> xRaw()<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN><SPAN style="color:#00007F">Dim</SPAN> yRaw()<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN><SPAN style="color:#00007F">Dim</SPAN> y2Raw()<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN><SPAN style="color:#00007F">Function</SPAN> Interpolate(X<SPAN style="color:#00007F">As</SPAN> Range, Y<SPAN style="color:#00007F">As</SPAN> Range, LookFor<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> i<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> v<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> yp1<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> ypn<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> c<SPAN style="color:#00007F">As</SPAN> Range
<SPAN style="color:#00007F">Dim</SPAN> NRow<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Integer</SPAN>
NRow = X.Cells.Count<SPAN style="color:#00007F">ReDim</SPAN> xRaw(NRow - 1)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN><SPAN style="color:#00007F">ReDim</SPAN> yRaw(NRow - 1)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN><SPAN style="color:#00007F">ReDim</SPAN> y2Raw(NRow - 1)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
yp1 = 1E+30
ypn = 1E+30
i = 0
<SPAN style="color:#00007F">For</SPAN><SPAN style="color:#00007F">Each</SPAN> c<SPAN style="color:#00007F">In</SPAN> X
xRaw(i) = c
i = i + 1
<SPAN style="color:#00007F">Next</SPAN> c
i = 0
<SPAN style="color:#00007F">For</SPAN><SPAN style="color:#00007F">Each</SPAN> c<SPAN style="color:#00007F">In</SPAN> Y
yRaw(i) = c
i = i + 1
<SPAN style="color:#00007F">Next</SPAN> c
SplineCompute2nDerivative xRaw, yRaw, X.Cells.Count, yp1, ypn, y2Raw
Interpolate = Splint(xRaw, yRaw, y2Raw, X.Cells.Count, LookFor)<SPAN style="color:#00007F">End</SPAN><SPAN style="color:#00007F">Function</SPAN><SPAN style="color:#00007F">Private</SPAN><SPAN style="color:#00007F">Function</SPAN> Splint(xa<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>, ya<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>, y2a<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>, n<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>,<SPAN style="color:#00007F">ByVal</SPAN> X<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> klo<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>, khi<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>, k<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> h<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, b<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, a<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
klo = 0
khi = n - 1
<SPAN style="color:#00007F">While</SPAN> khi - klo > 1
k = (khi + klo) / 2
<SPAN style="color:#00007F">If</SPAN> xa(k) > X<SPAN style="color:#00007F">Then</SPAN> khi = k Else: klo = k
<SPAN style="color:#00007F">Wend</SPAN>
h = xa(khi) - xa(klo)
<SPAN style="color:#00007F">If</SPAN> h = 0#<SPAN style="color:#00007F">Then</SPAN> MsgBox ("Bad xa input to routine Splint"):<SPAN style="color:#00007F">Exit</SPAN><SPAN style="color:#00007F">Function</SPAN><SPAN style="color:#007F00">'error handling for x1=x2</SPAN>
a = (xa(khi) - X) / h
b = (X - xa(klo)) / h
Splint = a * ya(klo) + b * ya(khi) + ((a * a * a - a) * y2a(klo) + (b * b * b - b) * y2a(khi)) * (h * h) / 6#<SPAN style="color:#00007F">End</SPAN><SPAN style="color:#00007F">Function</SPAN><SPAN style="color:#00007F">Private</SPAN><SPAN style="color:#00007F">Sub</SPAN> SplineCompute2nDerivative(X<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>, Y<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>, n<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>, yp1<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, ypn<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, y2<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Variant</SPAN>)
<SPAN style="color:#00007F">Dim</SPAN> i<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>, k<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Long</SPAN>
<SPAN style="color:#00007F">Dim</SPAN> p<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, qn<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, sig<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>, un<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">ReDim</SPAN> u(n - 1)<SPAN style="color:#00007F">As</SPAN><SPAN style="color:#00007F">Double</SPAN>
<SPAN style="color:#00007F">If</SPAN> yp1 > 9.9E+29<SPAN style="color:#00007F">Then</SPAN>
y2(0) = 0#
u(0) = 0#
<SPAN style="color:#00007F">Else</SPAN>
y2(0) = -0.5
u(0) = (3# / (X(1) - X(0))) * ((Y(1) - Y(0)) / (X(1) - X(0)) - yp1)
<SPAN style="color:#00007F">End</SPAN><SPAN style="color:#00007F">If</SPAN>
<SPAN style="color:#00007F">For</SPAN> i = 1<SPAN style="color:#00007F">To</SPAN> n - 2
sig = (X(i) - X(i - 1)) / (X(i + 1) - X(i - 1))
p = sig * y2(i - 1) + 2#
y2(i) = (sig - 1#) / p
u(i) = (Y(i + 1) - Y(i)) / (X(i + 1) - X(i)) - (Y(i) - Y(i - 1)) / (X(i) - X(i - 1))
u(i) = (6# * u(i) / (X(i + 1) - X(i - 1)) - sig * u(i - 1)) / p
<SPAN style="color:#00007F">Next</SPAN> i
<SPAN style="color:#00007F">If</SPAN> ypn > 9.9E+29<SPAN style="color:#00007F">Then</SPAN>
qn = 0
un = 0#
<SPAN style="color:#00007F">Else</SPAN>
qn = 0.5
un = (3# / (X
- X(n - 1))) * (ypn - (Y
- Y(n - 1)) / (X
- X(n - 1)))
<SPAN style="color:#00007F">End</SPAN><SPAN style="color:#00007F">If</SPAN>
y2(n - 1) = (un - qn * u(n - 1)) / (qn * y2(n - 1) + 1#)
<SPAN style="color:#00007F">For</SPAN> k = n - 2<SPAN style="color:#00007F">To</SPAN> 0<SPAN style="color:#00007F">Step</SPAN> -1
y2(k) = y2(k) * y2(k + 1) + u(k)
<SPAN style="color:#00007F">Next</SPAN><SPAN style="color:#00007F">End</SPAN><SPAN style="color:#00007F">Sub</SPAN></FONT>