好的,這是一個嘮叨我一段時間的問題,我確實認爲我已經破解了它,但是...命名範圍以獲取當前單元格上方的單元格塊 - 重寫以避免循環引用
考慮下列工作表:
數據單元只包含數字1和薩姆細胞含有所示的公式。這一切都有效。
它利用下列名稱(與解釋):
RangeAboveAll
=INDIRECT(CONCATENATE(ADDRESS(1,COLUMN()),":",ADDRESS(ROW()-1,COLUMN())))
的第一ADDRESS函數給出當前列的第一個單元的地址,所述第二地址函數給出當前小區上方的細胞。它們與a:CONCATENATE相交併傳遞給INDIRECT函數以將其轉換爲範圍參考。請注意,如果在頂行中使用,則會發生錯誤,因爲它應該如此。
BlankRowAbove
=IFERROR(SMALL(IF(ISBLANK(RangeAboveAll),ROW(RangeAboveAll),""),
COUNTIF(RangeAboveAll,"")),0)
IF函數創建對應於所述RangeAboveAll與如果小區ISBLANK列數和0,如果它不是一個列表。然後用COUNTIF參數傳遞給SMALL函數,該參數計算空白單元的數量;因此,SMALL返回最後一個空白單元格的列號。然後將其封裝在IFERROR中以處理沒有空白單元格的情況。
RangeAboveBlock
=INDIRECT(CONCATENATE(ADDRESS(1+BlankRowAbove,COLUMN()),":",
ADDRESS(ROW()-1,COLUMN())))
使用相同的技術作爲RangeAboveAll名稱,這需要在最後一個空白小區的列(或0,如果沒有一個),並返回開始1低於這個和當前小區以上結束1的範圍內。如果當前單元格上方的單元格爲空白,則會創建一個循環引用,但這很好。
正如我所說的,所有這些工作都很好,直到頂部塊中的一個數據單元指向底部塊的結果。例如,如果單元格B1
具有公式=B10
。
現在如果這樣做沒有動態範圍,這將不是循環引用,而是因爲動態範圍必須計算上面的所有單元格以便排除它們,所以會彈出循環引用。
這是一個特殊問題,因爲我們有一個電子表格,以下面的內容摘要開頭。現在可以通過開啓迭代來解決這個問題,但這會讓我們面對其他問題。它也可以用代碼實現,但我不想只爲此啓用宏。
任何人都可以看到一種方法來建立這種避免這個問題的命名範圍?
有關背景信息,有一個特定的問題(用戶錯誤),這是試圖克服。如果在B13中有一個靜態公式,例如=SUBTOTAL(B7:B12,9)
,並且您在B7或B12之下插入一行,則此新行將超出總和範圍。由於我們使用此電子表格作爲模板,爲許多不同項目的施工索賠準備工作,每個子項中的每行都有不同數量的行,因此將項目劃出價值數萬美元是一個問題。
令人印象深刻的?但似乎是避免使用小計的一種非常複雜的方式,您能澄清一下:「頂部塊中的一個數據單元是否意味着底部塊的結果」 - 頂部的ColumnA是否使用從下往上的塊總數?儘管你的解釋很清楚,但我承認我並沒有真正承認支持你的問題,但有一種感覺,你試圖克服的障礙可能最好是繞過了。 – pnuts
謝謝@pnuts - 總和只是作爲一個例子,它可以同樣使用小計,同樣的問題會出現。我將編輯該問題以準確顯示我的意思。 –