如何从另一个工作表中获取单元格值并将其分配给UDF的返回值?

时间:2011-09-22 10:09:13

标签: c# excel range user-defined-functions

这是我的两个工作表的小例子。

原始表

Original Sheet

如您所见,此工作表有两个单元格等待在稍后阶段重新计算。 (即带有红色#Eval标记的细胞)

结果表

Result Sheet

在上面的结果表中,我们得到了两个结果,分别是草莓和桃子。这两个结果是为两个#Eval单元格准备的,需要替换#Eval标记。

请注意,UDF实际上返回了#Eval,表示需要重新计算此单元格。重新计算将通过单击按钮等手动启动。

另请注意,位置映射在两张纸上 - 如果#Eval位于单元格A3中,那么结果表中的单元格A3中也会显示结果。

所以,我的主要目标是用相应的结果替换#Eval单元格。但是我将结果传递给我的UDF时遇到了麻烦 - 我不知道如何以编程方式获取当前正在重新计算的单元格的引用/地址。

下面是我目前获得的代码,我认为它没有正确实现。有人可以帮忙吗?或者还有其他方法可以实现吗?

提前致谢。

//assign value from result sheet back to result variable 
private string getResultFromResultSheet(Excel.Worksheet originalSheet, Excel.Worksheet resultSheet)
{
    string DataResult = null;            

    //Excel.Range resultSheetRange = resultSheet.UsedRange;
    //string addresse = resultSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

    Excel.Range originalSheetRange = originalSheet.UsedRange;  //<= I think it's incorrect here
    string os_currentAddress = originalSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

    Excel.Range currentRRange = null;

    currentRRange = resultSheet.get_Range(os_currentAddress, Type.Missing);
    if (currentRRange != null)
    {
        DataResult = currentRRange.Text;

    }
    return DataResult;
}

2 个答案:

答案 0 :(得分:2)

就个人而言,我会重新思考并按照Excel期望UDFS的方式编写UDF:

  • 将来自单元格的所有数据作为参数传递到UDF中(如果你不这样做,Excel不知道何时重新计算你的UDF,你将不得不使UDF易变,这是一个不好的想法)
  • UDF应将其结果返回到它所占用的单元格
  • 正如Govert所说:如果你需要UDF占用的单元格的范围对象(通常是为了找出调用范围的尺寸),你可以使用Application.Caller
  • 不要使用.Text(它为您提供单元格的格式化结果,该结果取决于用户所做的事情,并且可能包含###)使用.Value2而不是

然后原始工作表中的UDF = DataResult(ResultSheet!A1)

如果此方法不适合您的整体任务,您可能需要创建一个C#宏,该宏由一些事件触发器或按钮而不是UDF调用。

答案 1 :(得分:1)

从UDF中调用 Application.Caller 将返回调用单元格的Range对象。然后,您的UDF可以从另一个工作表中的相应位置读取数据。