【发布时间】:2015-10-19 23:19:03
【问题描述】:
我对包含公式的 Excel 工作表有疑问:
=Spline($D$9:$D$34,$J$9:$J$34,$D43)
工作表工作正常,直到我在网络驱动器上打开此工作表并将其保存在本地驱动器上。然后这个公式抛出#NAME?错误。奇怪的是,当我单击带有公式的行进行编辑并按回车键时,该错误消失了(公式没有任何变化)。
有人遇到过类似的问题吗?
我刚刚找到另一个信息。公式spline 是在 VBA 模块中定义的,而不是 Excel 内部的。看起来像。但问题仍然存在。
Function spline(periodcol As Range, ratecol As Range, x As Range)
Dim period_count As Integer
Dim rate_count As Integer
period_count = periodcol.Rows.Count
rate_count = ratecol.Rows.Count
If period_count <> rate_count Then
spline = "Error: Range count does not match"
GoTo endnow
End If
ReDim xin(period_count) As Single
ReDim yin(period_count) As Single
Dim c As Integer
For c = 1 To period_count
xin(c) = periodcol(c)
yin(c) = ratecol(c)
Next c
Dim n As Integer
Dim i, k As Integer
Dim p, qn, sig, un As Single
ReDim u(period_count - 1) As Single
ReDim yt(period_count) As Single
n = period_count
yt(1) = 0
u(1) = 0
For i = 2 To n - 1
sig = (xin(i) - xin(i - 1)) / (xin(i + 1) - xin(i - 1))
p = sig * yt(i - 1) + 2
yt(i) = (sig - 1) / p
u(i) = (yin(i + 1) - yin(i)) / (xin(i + 1) - xin(i)) - (yin(i) - yin(i - 1)) / (xin(i) - xin(i - 1))
u(i) = (6 * u(i) / (xin(i + 1) - xin(i - 1)) - sig * u(i - 1)) / p
Next i
qn = 0
un = 0
yt(n) = (un - qn * u(n - 1)) / (qn * yt(n - 1) + 1)
For k = n - 1 To 1 Step -1
yt(k) = yt(k) * yt(k + 1) + u(k)
Next k
Dim klo, khi As Integer
Dim h, b, a As Single
klo = 1
khi = n
Do
k = khi - klo
If xin(k) > x Then
khi = k
Else
klo = k
End If
k = khi - klo
Loop While k > 1
h = xin(khi) - xin(klo)
a = (xin(khi) - x) / h
b = (x - xin(klo)) / h
y = a * yin(klo) + b * yin(khi) + ((a ^ 3 - a) * yt(klo) + (b ^ 3 - b) * yt(khi)) * (h ^ 2) / 6
spline = y
endnow:
End Function
【问题讨论】:
-
这一刻,没有UDF,只有多个公式。如果我能在没有 VBA 的情况下解决这个问题,我会很高兴。
-
你可以尝试用它制作一个矩阵公式。输入公式时按
ctrl-shift-enter而不是enter -
我看不出使用
ctrl-shift-enter的意义。公式正在工作,直到我尝试重新保存工作表。因此,如果我用ctrl-shift-enter重写所有公式,您认为这会有所帮助吗?对我来说,这听起来像是某种黑暗魔法:/ -
因为您在公式中定义了一个矩阵。查看来自 MS Array formulars 的解释,以防您也可以向我们提供示例数据,以便我们自己尝试 =)
-
我发现
spline函数是在模块中定义的,并将代码插入到主要问题中。不幸的是ctrl-shift-enter不适合我
标签: vba excel excel-formula