Excel命名范围公式 - 不自动更新

时间:2017-04-20 15:38:57

标签: excel vba excel-vba excel-formula

我在Excel中有一个包含列标题名称的表(例如data_type1,data_type2等)。此表中的数据根据​​在另一个工作表上输入的参数进行更改,并将其拉到动态更新的图表中。

为了方便可能正在使用此工作表的用户,我添加了一个“用户指定的功能”(非vba),该功能也会绘制到其中一个图表中。根据用户指定的功能,我的意思是我有三个带下拉列表的单元格。两个对应于表格标题,一个具有可以在两个选定数据类型之间应用的简短操作列表(例如,用户可能选择'dataype1','+','datatype2',这将产生两个的总和。我表的最后一栏)。

用户指定的函数是通过定义一个命名的“范围/函数”以匹配下拉列表及其各自的列标题然后调用evaluate来实现的。见下文:

=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解决方案更受欢迎。

1 个答案:

答案 0 :(得分:0)

对于子孙后代,我将根据Mat的电子反馈回答上述问题:

关于问题的原因:

用户指定列未更新的原因是'评估' < user1_result'的一部分命名公式旨在用于应用程序级别而不是工作表函数。因此,Excel不会检查其先例是否会更改并忽略它以进行重新计算。

问题的解决方案:

建议使用VBA来监视worksheet_change事件,但是,我的问题要求我不使用VBA。因此,强制Excel检查先例并重新计算用户指定函数的替代解决方法使用两个步骤。这用作伪worksheet_change替身。

首先,我使用一个辅助单元格来执行具有任意计数条件的countif。我不需要它来改变,我只需要它与'user1_result'的输入共享先例。所以我计算第一行数据中大于某个常数的单元格数量:

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

这个计算的结果并不重要,但在我的情况下,我的数据值很小,因此总是返回0。

其次,我在用户指定列(我的数据表中的最后一列)中使用计算条件。

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

现在,只要我的数据表更新,使用命名函数的最后一列就会重新计算。很简单,如果使用宏不可行(例如由于客户端/用户的安全问题),这可以替代工作表更改事件。

我希望那里有人可以使用它!