在我的项目一个UDF的参数是另一个UDF函数的结果。
例如:
GetPeriod(string name, string date) {
// logic
}
Data(string name, string period) {
// logic
}
我使用两种不同的细胞中,这些作为UDF
cell a1: =GetPeriod("KMP", "27-12-18")
cell a3: =Data(a$1,"KMP")
我使用一个UDF(GetPeriod)作为另一UDF(数据)的参数的结果。
这里的问题是数据UDF被触发两次:一次与实际结果,而一个时间单元格A1的空值。
我试着计算模式设置为手动,但它仍然被调用两次。
是否有任何可能的问题,这样的设计还是有什么办法来设置在UDF的优先级,以便Excel明白先触发哪个UDF?
我不知道如何VBA代码转换为C#为Excel,所以我会尽力给予全面的解释/例子。
在VBA,有通过对一个Excel小区(或范围)的UDF的参考主要有两种方法。
Data(name as String)
)Data(name as Range)
或者更广泛地Data(name as Object)
)当使用字符串参数,所述范围的值在通过Worksheet("Name").Range("String Param")).Value
的代码通常访问。当使用对象参数,代码通常看起来像RangeParam.Value
。
还有,当一个范围被硬编码到或间接地通过一个UDF引用次。我会避免这样做;特别是如果该范围包含公式。
当Excel是做计算,执行多个步骤。
从这个理解的重要事情是:
其他一些注意事项:
如果在一个UDF出现错误,那就是如何处理可以改变之间是否在工作表中正在使用的UDF还是它正在通过其他代码调用一点点。
我不认为你将能够防止Excel运行计算两次,因为这是它是如何确定的依赖关系(除非我完全误解你写的)的一部分。不过,我也期待与A1
的空值的计算会与实际结果的最终计算值之前进行。如果第二(最终)的计算结果是一个与空白A1
,那么我不知道该怎么告诉你,除了检查,所有单元格/区域正在一个UDF引用被传递到了UDF为参数的对象。
确保电池A3您将UDF到单元格A1之前是空的。该“数据” UDF被调用的唯一方法是,如果它已经在你将它添加到表存在。为了澄清 - 如果在A3单元格中没有公式,那么就没有办法了“数据” UDF可以被调用。但是,通过将“周期”变化中的A1单元格的值UDF将触发公式单元格A3重新计算,因为传递的参数之一到它只是得到了改变。另一种办法是在预测仅仅需要的值,而不是在细胞中的实际的UDF。在这种情况下简单地设定使用‘数据’和‘期间’的功能细胞的” .Value2" ,使‘周期’的值作为函数进入‘数据’的功能。
Range rngPeriod; //Set to cell "A1"
Range rngDate; //Set to cell "A3"
rngPeriod.Value2 = GetPeriod("KMP", "27-12-18");
rngData.Value2 =Data(GetPeriod("KMP", "27-12-18"),"KMP");