【发布时间】:2020-07-26 15:31:56
【问题描述】:
我在同一个工作簿的多个工作表上有一个范围,一列中有 35 个“X”值,需要返回与名为“DB”的固定工作表上的自定义第五多项式曲线/函数相对应的“Y”值对于上述曲线,支持 C37:C76 上的“x”值和 D37:D76 上的“y”值。
本质上是一个图形化的 VLOOKUP 函数,而不是一个包含 1000 行的表。
作为一次性计算,常规计算方法 100% 有效,但如果您需要为多个工作表上的多个 X 值计算 Y,这将成为一个问题。我认为UDF会起作用,但我不知道如何实际做到这一点。我尝试了一些代码变体并将其清理为这篇文章的起点。
任何帮助使这个 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
【问题讨论】:
-
如果要计算工作表公式,则需要使用
Worksheet.Evaluate方法。例如C1 = mySheet.Evaluate("=INDEX(LINEST(R37C3:R76C3, R37C4:R76C4^{1,2,3,4,5}), 1, 5)")并将ADJ = ...行移至该行的输入分配后。 -
谢谢蒂姆,我更新了代码(如上所示),但得到了#Value!错误
-
从 Sub 运行你的函数,这样你就可以看到问题出在哪里。你真的有一个代号为“mySheet”的工作表吗?
-
我给 X 一个随机值,并且没有任何 C1 到 A 值,它可以工作,即弹出一个消息框,其中包含计算的 ADJ 值。例如,只要我添加 A,我就会收到类型不匹配错误。我猜这意味着 A 计算返回错误..也许?难道是
Sheets(11).Evaluate("=INDEX(LINEST(D37:D76, C37:C76^{1,2,3,4,5}), 1, 6)")格式不对?
标签: excel vba user-defined-functions polynomials