在我的项目中,一个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(Data)的参数。
这里的问题是数据自定义函数被触发了两次:一次是实际结果,另一次是单元格A1的空值。
我尝试将计算模式设置为手动,但它仍然被调用两次。
这种设计有没有可能有问题,或者有没有办法在UDF中设置优先级,以便Excel知道首先触发哪个UDF?
发布于 2018-12-26 23:24:38
我不确定VBA代码如何转换为c# for Excel,所以我将尝试给出一个全面的解释/示例。
在VBA中,将excel单元格(或区域)的引用传递给UDF主要有两种方法。
使用字符串参数(即,Data(name as String))
Data(name as Object))或更广义地说,
Data(name as Range) 当使用字符串参数时,通常通过Worksheet("Name").Range("String Param")).Value在代码中访问范围的值。使用object参数时,代码通常类似于RangeParam.Value。
有时,范围被硬编码到UDF中或被UDF间接引用。我会避免这样做;特别是如果该范围包含一个公式。
当Excel进行计算时,它执行多个步骤。
从这里要理解的重要事情是:
如果某个范围是通过字符串参数引用的,则Excel可能无法理解计算中引用的范围的dependency.
其他一些注意事项:
如果在UDF中出现错误,那么在工作表中是否使用该UDF或是否通过其他代码调用它之间,处理方式可能会略有不同。
我认为您无法阻止Excel运行两次计算,因为这是它确定依赖项的方式的一部分(除非我完全误解了您所写的内容)。但是,我也希望使用空值A1的计算将在将最终计算值与实际结果进行之前进行。如果第二个(最终)计算结果是带有空白A1的结果,那么我不知道该告诉你什么,除了检查在UDF中引用的所有单元格/范围是否都作为参数对象传递到该UDF中。
发布于 2018-12-26 23:52:47
在将自定义项插入到单元格A1之前,请确保单元格A3为空。调用"Data“UDF的唯一方法是在要添加它的工作表中已经存在”Data“UDF。需要说明的是,如果单元格A3中没有公式,那么就不可能调用"Data“自定义函数。但是,通过在单元格A1中插入"Period“UDF来更改该值将触发单元格A3中的公式重新计算,因为传递到该单元格中的一个参数刚刚被更改。另一种选择是只需要单元格中的值,而不需要实际的UDF。在这种情况下,只需使用"Data“和"Period”函数设置单元格的".Value2“,将"Period”值作为函数传递给"Data“函数。
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");https://stackoverflow.com/questions/53933121
复制相似问题