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

标签 c# excel range user-defined-functions

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

原单 :

Original Sheet

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

结果表 :

Result Sheet

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

请注意,#Eval 实际上是由 UDF 返回的,表示需要重新计算此单元格。重新计算将通过单击按钮或其他东西手动启动。

另请注意,该位置映射到两个工作表 - 如果#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;
}

最佳答案

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

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

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

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

    关于c# - 如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513077/

    相关文章:

    c# - 如何将 'System.Windows.Media.Imaging.BitmapImage' 转换为 'System.Drawing.Image' ?

    c# - Visual Studio 无法发现测试 (xunit)

    c# - 如何将名称和按下程序的路径传递给我的程序?

    r - 在 R 中使用 openxlsx2 导入时出现错误?

    java - 从指定的概率分布中随机选择一个范围内的数字

    c# - 从数据库中处理 100 万条记录的技术是什么

    arrays - 如何将值传递给数组然后遍历数据集

    javascript - 将 jtable 导出到 IE 上的 javascript 中的 excel

    python - “范围”对象不支持项目分配 - 尝试在 python 3.3 中使用旧的 python 代码

    excel - VBA SUM 可变范围