2016-03-25 51 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