2016-03-25 29 views
0

我有一个大型电子表格:700多行,每个都有对前一行的引用。我使用参考函数:ROW(),COLUMN()INDIRECT()ADDRESS()。 (是的,我已经考虑每隔50-100行固定一个值以减少计算跟踪。)False错误522:循环引用

直到最近我使用OpenOffice.org并且它工作正常。然而,LibreOffice在打开文件时似乎放弃了一些行并且进一步的计算变成了错误522.有时候,一次更改会重新计算它,并且当我撤消更改时,错误消失并不再出现。我也发现了关于Ctrl-Shift-F9(必须重新计算),这也使得错误消失。

即使该文件已被LibreOffice保存并重新保存好几次,它仍然会报告错误522当我打开该文件时,所以它似乎不是兼容性问题。

问题是一个很长的分支计算线索使软件认为它永远不会达到初始值,因此它必须是循环的? (我的固定价值观念可以解决这个问题。)或者还有其他我可能错过的东西?

UPDATE

我看不到INDEX()会如何帮助。我想引用上面的一个单元格或紧接着上面一行的单元格。单元格d46可能指向d45或b45或$ a45,并且在复制行时会起作用,但在插入或删除行时不起作用:如果在上面插入一行,则指向上方1行的引用将开始指向上方2行,所以每次我都要编辑公式。行(每行)包含几行对上面行的引用,所以我认为最简单的方法是同一列的INDIRECT(ADDRESS(ROW() - 1,COLUMN()))或INDIRECT(ADDRESS(ROW() -1,1))列A ......任何更好的解决方案?

+0

INDIRECT是[volatile函数](http://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/),可能是导致问题的原因之一。我的第一步是尝试重写不使用INDIRECT的函数;将INDEX视为可能的替代品。 – Lyrl

回答

0

我不知道问题的具体情况,但它听起来像它会帮助简化公式,正如您所建议的。

另一种可能性是编写宏来处理一些计算工作。除了Basic,宏可以用Java编写,你似乎很熟悉。宏可以从电子表格函数调用,或者在文档加载时调用。

它也可能有助于使用更强大的工具,如MySQL的LibreOffice Base。通常需要大量INDIRECT()ADDRESS()的电子表格实际上正在使用数据库类型的逻辑。

+0

电子表格将镜像所有交易的帐户,但会跟踪2人或更多人的余额并计算应计利息。是的,我可以直接引用上面的行,但问题在于插入或删除行会导致此类引用错误。使用'INDIRECT()'和'ADDRESS()'解决了这个问题。 – Heimdall

+0

我的想法不是简单地修改公式,而是为了修正每隔50-100行(因此将所有公式连续更改为它们返回的值),因为我不会更改超过50-100个事务。 – Heimdall