使用 5 次多项式从给定的 X 值 UDF 到 return Y 值

UDF to return Y value from given X value using 5th Polynomial

我在同一个工作簿中有几个 sheet 的范围,一列中有 35 个关闭“X”值,并且需要 return“Y”值对应于自定义的 5 次多项式称为“DB”的固定 sheet 上的曲线/函数,在 C37:C76 上支持“x”值,在 D37:D76 上支持上述曲线的“y”值。

本质上是一个图形化的 VLOOKUP 函数,而不是具有 1000 行的 table。

作为一次性计算,正常计算方法 100% 有效,但如果您需要在几个 sheet 秒内针对多个 X 值计算 Y,这就会成为一个问题。我认为 UDF 可以工作,但我不知道如何实际操作。我尝试了一些代码变体并为此 post 清理了它作为起点。

如能提供帮助使此 UDF 正常工作,我们将不胜感激。

Function ADJ(X As Single) As Single

'X = FUNCTION INPUT VALUE
'Y = RESULT = ADJ = C5*X^5 + C4*X^4 + C3*X^3 + C2*X^2 + C1*X^1 + A
        
        C1 = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 5)")
        C2 = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 4)")
        C3 = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 3)")
        C4 = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 2)")
        C5 = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 1)")
         A = Sheets(11).Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 6)")
       ADJ = C5 * X ^ 5 + C4 * X ^ 4 + C3 * X ^ 3 + C2 * X ^ 2 + C1 * X ^ 1 + A
         
End Function

运行 它作为子程序:

Option Explicit

Sub ADJ1()

Dim ADJ As Variant
Dim X As Variant
Dim A As Variant
Dim C1 As Variant
Dim C2 As Variant
Dim C3 As Variant
Dim C4 As Variant
Dim C5 As Variant

X = 3

         C1 = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 5)")
         C2 = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 4)")
         C3 = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 3)")
         C4 = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 2)")
         C5 = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 1)")
          A = Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 6)")
       
       'ADJ = C5 * X ^ 5 + C4 * X ^ 4 + C3 * X ^ 3 + C2 * X ^ 2 + C1 * X ^ 1 + A
       
       ADJ = X ^ 5 + X ^ 4 + X ^ 3 + X ^ 2 + X ^ 1
       MsgBox ADJ
       
       
End Sub

我有解决办法和意见。我仍然不确定这个意见是否完全正确。 意见:我永远不会在引用范围时使用 UDF。您正在使用的范围必须是函数的参数。 查看此解决方案:

Public Function ADJ(X As Range, Y As Range, xvalue As Double) As Double
    Dim pol As Variant
    Dim arrPolNth As Variant
    Dim n As Integer
    n = 5
    arrPolNth = Array(1, 2, 3, 4, 5)
    pol = Application.LinEst(Y, Application.Power(X, arrPolNth))
    Dim i As Integer
    For i = LBound(pol) To UBound(pol)
        ADJ = ADJ + Application.Power(xvalue, n - i + 1) * pol(i)
    Next i
End Function

这不是最好的,因为多项式的阶数也应该是一个参数。