我有一本工作簿,每年一張,需要取得該工作表當年過去的所有月份的平均值。這些表格按年份命名,我將公式命名為:MONTHS
。
=LET(year,VALUE(MID(CELL("filename"),SEARCH("]",CELL("filename"))+1,31)),IF(YEAR(TODAY())=year,MONTH(TODAY())-1,IF(year>YEAR(TODAY()),0,12)))
並用它來獲得平均值:
它在大多數情況下都有效,但是當我在其他單元格或工作表中執行某些操作時,它會返回#計算錯誤提示不支援空數組。當我重新計算工作表時,它會自行修復,但必須一直這樣做非常煩人。有什麼辦法可以防止這種情況發生嗎?
答案1
根據多年的 APL 使用經驗,我個人認為空數組支援至關重要。不支援空數組是 Microsoft 的一個錯誤。
答案2
我沒有TAKE()
可用的信息,因此無法明確地說“這是你的問題”。我將解決兩個方面的問題,即您的MONTHS
命名範圍可能會限定在工作簿的範圍內,但需要限定在工作表的範圍內,以便它可以在每個不同的工作表上指定特定的單元格,並且TAKE()
可能由於兩個潛在的問題而成為問題,指定,,
rows 參數和下面提到的第一件事,MONTHS
有時返回“0”,因此告訴TAKE()
不返回列,因此返回空數組。
事實上,您在處理其他工作表的情況下提到了這個問題,然後返回傾向於第一類,即範圍,MONTHS
因此CELL()
沒有指定任何特定單元格。但事實上,指定0
列似乎可能會產生空數組,並且您被告知不支援空數組,這表示這就是問題所在。然而,在這種情況下,事情不應該這麼簡單地解決。 「不應該」當然不等於「不會」。所以灰色地帶。
但以下將為您提供三個可以輕鬆檢查的重要內容,並且為了使其更容易,我已經測試了命名範圍範圍材料,事實確實如此。 (我還測試了強制 Excel 永遠不返回所描述的錯誤的標準方法,並且它不能解決問題。)TAKE()
不過,我無法從測試中得知它會如何影響。不過,您將看到如何輕鬆測試這兩件事。我的賭注是MONTHS
最適合所描述問題的範圍。所以它是第一位的:
您的公式有三種可能的結果,其中之一是0
。
到目前為止,一切都很好。但是,在您的TAKE()
函數中,您使用其結果來指定要傳送到函數的列數AVERAGE()
。
MONTHS
但是,在公式返回時形成數組時0
,您正在告訴您要在其所在的行中TAKE()
獲取列。0
0
為了讓這個方法適合你,你需要一個更複雜的方法。例如:
使用IF()
來測試MONTHS
的結果。如果0
,則在儲存格 O5 中傳回結果 $0.00。如果不是結果,則按原樣0
使用公式。AVERAGE()
或者
當計算的結果是將來時,會回傳 a1
而不是 a 。人們會認為該工作表上的所有行都是空的,因此您將取一個值為零的儲存格的平均值並傳回零。如果不是,則可能可以看出一些類似的邏輯。0
year
另一個想法,不直接相關,目前不會造成任何問題,是CELL("filename")
每次Excel 重新計算時,按照您的方式編寫會強制Excel 重新計算所有工作表上的每個使用實例,而不僅僅是這個工作表。來自處理另一張工作表的問題由您在問題中給出的部分內容描述:當在另一張工作表上時,Excel 重新計算其他工作表之一,它使用您所在的工作表來返回CELL()
而不是正在使用它的那張紙,除了您所在的那張紙之外。因此,所有其他結果都會得到不幸的結果,Excel 似乎意識到了這一點,並對所有結果都傳回錯誤。正如我在下面提到的,這只會讓你惱火,或者如果老闆抱怨它,或者工作表是死胡同,它們的結果不是其他工作表的先例單元格,比如多年來工作表的求和,這會讓你感到尷尬。但如果是的話,他們就會向這些前向使用中輸入錯誤,導致他們回傳錯誤...
因此,關於這一點:這會導致問題,不是在編輯當前工作表時,而是在導航到在不同工作表上進行基本上任何編輯時。當您這樣做時,其他工作表將#VALUE!
向其使用 的儲存格發出錯誤MONTHS
。可以說,這並不是什麼大問題,只要每張紙都是獨立的並且不會插入任何其他紙張中。您會去工作表做一些工作,並會惱火地查看錯誤的效果(肯定是“空數組”情況,儘管我沒有TAKE()
,因此無法測試確切的效果......它可能會返回一個取平均值的錯誤數組,因此AVERAGE()
不會產生#CALC!
錯誤,而是產生自己的#VALUE!
錯誤。 無論如何,這只會讓你煩惱,並讓老闆感到不安,但在你在工作表上第一次輸入時,它會。 。
您可以透過建立MONTHS
SHEET 範圍而不是 WORKBOOK 範圍來解決該問題。並且透過為其中的兩個CELL()
函數中的每一個指定一個單元格(任何單元格,但為什麼不是單元格 A1?)。一旦你這麼做了,這個問題就消失了。
當然,這意味著為每個現有工作表建立命名範圍,但如果有模板,或者透過複製當前工作表並刪除資料來新增年份,則每次複製時都會建立具有工作表範圍的命名範圍,並且重命名。所以對未來來說不是問題。MONTHS
執行此操作後,刪除 WORKBOOK 範圍的命名範圍。
如果TAKE()
給出,,
so norows
參數,有時給出0
for the columns 參數並不是困難的根源(我沒有給出太多機會,但可能是 MS 改變了他們的整個哲學方法:他們似乎沒有這樣做他們做了什麼INDEX()
) ,那麼很可能CELLS()
是使用問題。
就目前而言,我目前所能找到的有關該功能的只是他們的廣告宣傳,或者通過令人愉快的示例、文本和視頻很好地宣傳,但由於沒有人研究現實生活中的使用問題,我並不是談論已對其進行測試以供您使用。我注意到微軟過去幾年的做法是不允許舊的,,)
INDEX()
可以使用,而是,當他們說需要 rows 參數時,他們甚至不是指他們的舊的,“必須指定行或列”,而是相反,無論您是否提供列參數,都必須提供行參數。另外,希望他們將您的,,MONTHS)
意思解釋為“那一行,這麼多列”,人們希望他們正在做隱式交集,這可能實際上並非如此,因為他們在實踐和概念上都明確地擺脫了它。
所以問題看起來像:
需要使用 SHEET 範圍的
MONTHS
命名範圍與(可能是)WORKBOOK 範圍的版本。TAKE()
是不處理有時返回的“0”的問題MONTHS
。TAKE()
是不處理行參數缺失的問題。TAKE()
上述 2 和 3 的問題都是問題。
編輯:經過所有這些研究並發現沒有任何幫助後,我發布了此內容,然後單擊了另一個搜索頁面...並找到了一個網站,該網站有一個使用,,MONTHS)
我上面經常提到的部分的示例,並顯示TAKE()
成功,因為它採取了忽略任何內容的方法rows ,因此傳回所有行,就像INDEX()
will.row 中參數的簡單使用一樣。
所以這方面不是問題。抱歉,我對基本答案進行了太多編輯,無法刪除它所在的部分,而沒有最終完全重寫它,現在為時已晚,因為我的床在召喚。但這種用法不是問題,因為他的範例顯示了該用法的正確返回。它是在:
https://www.get-digital-help.com/how-to-use-the-take-function/
第 4 部分:在佈局中,大約位於頁面下方的 20-25%。