使用 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
这不是最好的,因为多项式的阶数也应该是一个参数。
我在同一个工作簿中有几个 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
这不是最好的,因为多项式的阶数也应该是一个参数。