Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 初始化电子表格、计算顺序_Excel_Vba - Fatal编程技术网

Excel 初始化电子表格、计算顺序

Excel 初始化电子表格、计算顺序,excel,vba,Excel,Vba,我已经写了一个VBA代码,它解决了一组系数矩阵为三对角的代数方程组(称为Thomas算法)。方程的形式如下 A(i)X(i-1)+B(i)X(i)+C(i)X(i+1)=R(i) A、B、C和R的值被传递给返回X值的函数。下面是VBA代码 Option Base 1 Function TRIDI(ByVal Ac As Range, ByVal Bc As Range, ByVal Cc As Range, _ ByVal Rc As Range) As Variant Dim BN As Si

我已经写了一个VBA代码,它解决了一组系数矩阵为三对角的代数方程组(称为Thomas算法)。方程的形式如下

A(i)X(i-1)+B(i)X(i)+C(i)X(i+1)=R(i)

A、B、C和R的值被传递给返回X值的函数。下面是VBA代码

Option Base 1
Function TRIDI(ByVal Ac As Range, ByVal Bc As Range, ByVal Cc As Range, _
ByVal Rc As Range) As Variant
Dim BN As Single
Dim i As Integer
Dim II As Integer
Dim A() As Single, B() As Single, C() As Single, R() As Single, X() As Single
N = Ac.Rows.Count
ReDim A(N), B(N), C(N), R(N), X(N)
For i = 1 To N
A(i) = Ac.Parent.Cells(Ac.Row + i - 1, Ac.Column)
B(i) = Bc.Parent.Cells(Bc.Row + i - 1, Bc.Column)
C(i) = Cc.Parent.Cells(Cc.Row + i - 1, Cc.Column)
R(i) = Rc.Parent.Cells(Rc.Row + i - 1, Rc.Column)
Next i
A(N) = A(N) / B(N)
R(N) = R(N) / B(N)
For i = 2 To N
II = -i + N + 2
BN = 1 / (B(II - 1) - A(II) * C(II - 1))
A(II - 1) = A(II - 1) * BN
R(II - 1) = (R(II - 1) - C(II - 1) * R(II)) * BN
Next i
X(1) = R(1)
For i = 2 To N
X(i) = R(i) - A(i) * X(i - 1)
Next i
TRIDI = Application.WorksheetFunction.Transpose(X)
End Function
该函数适用于线性方程组。如果方程是非线性的,例如下面三个方程

X(1)=1

X(1)-2X(2)+X(3)=3+X(1)^2

X(1)+X(3)=2

该解决方案是使用Excel的迭代功能迭代获得的,如下所示。(由于这是我的第一篇帖子,我还不能发布图片。如果你给我发电子邮件,bumedoc@gmail.com,我也可以将电子表格发送给您)


然而,在保存电子表格并再次打开它之后,我得到了#值!E2中的错误:E4和D3。我假设在打开电子表格时,Excel会尝试初始化具有循环引用的单元格,并将其弄糊涂。有人能解决这个问题吗?

=IFERROR(3+E2^2,0)
替换
=3+E2^2
对我有效。

感谢您的回复。它解决了这种情况下的问题。是否有一种更通用的方法可以从TRIDI内部在父工作表中执行相同的函数(或添加另一个函数),从而避免向包含a、B、C和R值的所有单元格添加IFERROR的必要性?添加一个错误处理程序,在出现错误时强制UDF抛出0就可以了。似乎编写UDF可能很棘手。。我在这里找到了一些信息:我尝试了这个方法,但没有成功。对于I=1到na(I)=Ac.Parent.Cells(Ac.Row+I-1,Ac.Column)如果(iError(A(I)),那么A(I)=1在对变量进行尺寸标注后(在Dim语句之后),添加以下行:
On Error GoTo errHandler
然后在最后,就在“End Function”行之前,添加:
Exit Function errHandler:TRIDI=0
这会将流定向到“errHandler”部分。每当发生错误时,函数将获得0值并终止。iError(A(i))将检查A(i)是否为错误类型,但不会在其他地方捕获其他错误。谢谢Ioannis!它确实奏效了,我真的很感激。我已经为此挣扎了一段时间。再次感谢。
     A    B    C     D                  E

1    A    B    C     R                  X

2    0    1    0     =1          =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)

3    1   -2    1     =3+E2^2     =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)

4    1    1    0     =2          =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)