2017-04-20 88 views
0

我在Excel中有一個表格,它有列標題名稱(例如data_type1,data_type2等)。該表中的數據根據​​另一張紙上輸入的參數而變化,並且它們被拉到動態更新的圖表上。Excel命名範圍公式 - 不自動更新

爲了方便使用此工作表的用戶,我添加了一個'用戶指定函數'(non-vba),它也繪製到其中一個圖表上。用戶指定的功能我的意思是我有三個單元格下拉列表。兩個對應於表格標題,一個具有可以在兩個選擇的數據類型之間應用的短操作列表(例如,用戶可以選擇'dataype1','+','datatype2',這將產生兩個我的表格的最後一列)。

用戶指定的功能是通過定義一個命名的「範圍/函數」來使下拉列表與它們各自的列標題匹配,然後調用評估來實現的。請看下圖:

=EVALUATE("="&ADDRESS(ROW('Raw Data'!XFD5),MATCH(user_in1,'Raw Data'!$A$4:$AF$4,0)) & user_operation & ADDRESS(ROW('Raw Data'!XFD5),MATCH(user_in2,'Raw Data'!$A$4:$AF$4,0))) 

我也命名爲「user1_result」,然後在我的表的最後一欄輸入= user1_result。這種方法非常好,因爲它的計算速度比通過在VBA中構建UDF然後將該UDF應用於相當長的列中的每個單元格來做同樣的事情要快得多。

現在這裏是我的掛機,它最初可以正常工作,但是如果用戶更改參數影響一個或兩個選定的數據類型,那麼用戶指定的列不會隨更新的數據實時重新計算。如果用戶重新切換任何下拉菜單,數據將重新計算。我猜測這是來自以下兩種情況之一: 1)Excel無法識別'user1_result'的先例已經改變,所以爲了提高效率,不需要重新計算列; 2)在'user1_result'的命名定義中使用的'Evaluate'函數未被檢查用於更新,因爲它不是一個正常的函數(如果試圖將其添加到單元格中,它不會通過intellisense顯示)。

所以我正在尋找一些確認或駁斥這些猜測。在確認的情況下,我希望得到一些關於如何強制用戶指定的列更新的建議,如果它的先例發生變化。

一個解決方案是讓VBA爲我檢查並強制執行計算,但是我想把它作爲最後的手段。所以,非VBA解決方案是首選。

+0

「這不是一個正常的功能」 - 事實上,這是一個黑客。你通過公式欄調用Application.Evaluate。如果您願意處理'Changed'工作表事件以監控您的*先例*的修改,則VBA解決方案將變得非常簡單。 –

+1

@ Mat'sMug謝謝您對評估的澄清!我同意VBA解決方案是最簡單的,但是這個工具的要求是​​它不需要啓用宏。你已經慢跑了我的思維過程,我想我有一個解決方案。我已經添加了兩件事: 在第一行數據上有一個countif的單元格,如果它沒有關係,那麼這個單元格會計數。 如果countif單元格=自身,則運行user1_result的條件。這樣任何參數更新都會觸發countif,它會觸發條件並重新計算。 感謝大腦慢跑! – fallengyro

回答

0

爲後人我會回答基於Mat'sMug的反饋上面的問題:

關於問題的原因:

用戶指定的列不更新的原因是因爲「評估」部分'user1_result'命名公式旨在用於應用程序級別而不是工作表函數。因此,Excel不會檢查其先例是否改變,並忽略重新計算。

問題的解決方案:

有人建議使用VBA來觀看worksheet_change事件,不過,我的問題要求我不使用VBA。因此,強制Excel檢查先例並重新計算用戶指定函數的替代解決方法使用兩個步驟。這起到僞工作表變量替身的作用。

首先,我使用一個輔助單元,它執行任意計數條件下的countif。我不需要改變,我只是需要它與「user1_result」的輸入分享先例。所以,我有指望它是比一些常數大數據的第一行中的細胞數量:

=COUNTIF(A5:AK5,">100000") 

這個計算的結果並不重要,但對我來說我的數據有小的值等這總是返回0。

其次,我在用戶指定的列(我的數據表中的最後一列)中使用條件進行計算。

=IF($AO$1=$AO$1,user1_result) 

現在,無論何時我的數據表更新,使用命名函數的最後一列將重新計算。簡單,如果使用宏不可行(例如,由於客戶端/用戶的安全考慮),這可以替代工作表更改事件。

我希望有人在那裏得到使用!