我有一个包含多个循环引用的复杂财务模型。有时会在模型中填充#value
。这种情况发生在75次重新计算中可能只有1次,因此该模型通常可以正常运行。给定循环引用,我无法跟踪错误以找到错误的开始。我的想法是使用VBA
代码在#value
的第一个结果值(或任何其他错误)的计算中间停止计算。这样,我可以专注于错误发生的位置以及错误是由用户定义的问题(例如rand()
范围)触发的,还是Excel只是多个循环引用存在问题。谢谢您的解决方案!
答案 0 :(得分:0)
某种程度上,通过保持“手动”计算方法可以直接从VBA控制迭代的粗略解决方法。仅当您对引起错误的根本原因的特定单元格感兴趣并且所涉及的单元格数量受到限制时,才可能将其添加到范围合并中。
还有其他一些优雅的方法可以满足您的要求,并邀请您就此主题作进一步的回答,但只需提供已长期用于类似要求的方法即可。
Sub doStepCal()
Dim Rng As Range, cell As Range, iteNum As Long, MaxIte As Long, Yn As VbMsgBoxResult
Set Rng = Union(Range("A1:A8"), Range("B2"), Range("E1:J1")) ' add all the cells involved in your calc
Application.Calculation = xlCalculationManual
MaxIte = 100 ' max iteration limit
Yn = vbNo
For iteNum = 1 To MaxIte
For Each cell In Rng.Cells
cell.Calculate
If IsError(cell.Value) Then
Yn = MsgBox("Error in Cell " & cell.Address & " Iteration: " & iteNum & ". Do you want to stop Calc?", vbYesNo, " Must restart Automatic calc after Stopping calc")
If Yn = vbYes Then Exit Sub
End If
Next cell
'If Yn = vbYes Then Exit For
Next iteNum
Application.Calculation = xlCalculationAutomatic
End Sub
结果看起来像
如果只想停止特定迭代的计算就足够了,但是由于工作表将完成计算并且所有相关单元都将显示为错误,因此很难跟踪导致错误的特定单元格。
Private Sub Worksheet_Calculate()
Dim Rng As Range, cell As Range
Set Rng = Union(Range("A1:A8"), Range("E1:J1"))
Application.EnableEvents = False
For Each cell In Rng.Cells
If IsError(cell.Value) Then
Yn = MsgBox("Error in Cell" & cell.Address & " Do you want to stop Calc?", vbYesNo, " Must restart Automatic calc after Stopping calc")
If Yn = vbYes Then
Application.Calculation = xlCalculationManual
Exit For
End If
End If
Next cell
Application.EnableEvents = True
End Sub
答案 1 :(得分:0)
尚不清楚您是要容忍循环引用,还是只想检测这些引用何时会带来问题,或者根本想删除它们。
循环引用最有可能表明公式有误(我强烈建议您仔细检查一下),如果是这样,即使没有暗示错误,也应将其删除。
要删除它们,可以使用 Formula ->下拉菜单中的工具(错误检查/跟踪错误/循环引用)。参见official documentation。 同样位于功能区中错误检查下面的项目 Evaluate Formula 也非常有用。
另请参阅:
https://www.extendoffice.com/documents/excel/1049-excel-identify-locate-circular-reference.html
https://www.ablebits.com/office-addins-blog/2015/12/15/circular-reference-excel/