Excel的UDF采用空参数不想要第二次调用

问题描述 投票:1回答:2

在我的项目一个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?

c# excel vba excel-formula excel-addins
2个回答
1
投票

我不知道如何VBA代码转换为C#为Excel,所以我会尽力给予全面的解释/例子。


在VBA,有通过对一个Excel小区(或范围)的UDF的参考主要有两种方法。

  1. 使用字符串参数(即Data(name as String)
  2. 使用一定范围的对象参数(即Data(name as Range)或者更广泛地Data(name as Object)

当使用字符串参数,所述范围的值在通过Worksheet("Name").Range("String Param")).Value的代码通常访问。当使用对象参数,代码通常看起来像RangeParam.Value

还有,当一个范围被硬编码到或间接地通过一个UDF引用次。我会避免这样做;特别是如果该范围包含公式。


当Excel是做计算,执行多个步骤。

  1. 发起计算在每个单元中以确定的范围内的参数。 (这是用于确定依赖关系。)
  2. 创建计算的正确顺序的依赖关系树。
  3. 不要在确定的顺序最终确定的计算。

从这个理解的重要事情是:

  • 如果范围是通过一个字符串参数引用,Excel可能不明白的依赖。
  • 如果范围为在计算中引用,但在硬编码,间接引用,或以其他方式没有通过在作为参数,Excel将不明白的依赖性。
  • 如果UDF会得到不同的结果取决于它的运行次数,那么就会出现意想不到的结果(从Excel的多步依赖性的测定)。

其他一些注意事项:

如果在一个UDF出现错误,那就是如何处理可以改变之间是否在工作表中正在使用的UDF还是它正在通过其他代码调用一点点。

我不认为你将能够防止Excel运行计算两次,因为这是它是如何确定的依赖关系(除非我完全误解你写的)的一部分。不过,我也期待与A1的空值的计算会与实际结果的最终计算值之前进行。如果第二(最终)的计算结果是一个与空白A1,那么我不知道该怎么告诉你,除了检查,所有单元格/区域正在一个UDF引用被传递到了UDF为参数的对象。


0
投票

确保电池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");
© www.soinside.com 2019 - 2024. All rights reserved.