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

Posted

技术标签:

【中文标题】如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?【英文标题】:How to get the cell value from another worksheet and assign it to the return value of UDF? 【发布时间】:2011-09-22 10:09:13 【问题描述】:

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

原稿

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

结果表

在上面的结果表中,我们得到了两个结果,分别是草莓和桃子。这两个结果是为两个#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;

【问题讨论】:

【参考方案1】:

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

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

那么你在原始表中的UDF =DataResult(ResultSheet!A1)

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

【讨论】:

非常感谢您的帮助。不过再问 1 个问题,当我使用 .Value2 时,我似乎遇到了类型转换问题。如果原始数据是基于文本的值,我认为它可以正常工作,但是当涉及到日期类型数据时,它会给我不正确的结果。 string result = (string)ResultRange.Value2; 是我目前使用的代码。也许我应该先将 .Value2 转换为 Object? Excel 日期值是双精度的,而不是字符串 由于 Excel 单元格可以包含任何双精度、错误、字符串或布尔值,因此通常最安全地将其转换为对象,除非如果单元格数据不属于所需类型,则需要出错 我遇到了 Application.Caller 的问题。它以某种方式返回-2146826265。我也在这里发布了问题***.com/questions/7887360/…【参考方案2】:

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

【讨论】:

非常感谢。这正是我想要的。我还是 Excel 编程的新手。另外,MSDN 上的 API 文档的某些部分并没有很好的记录,这使得学习/参考有点困难。 :( 我想你们真的需要一点帮助。再次感谢大家的回答。 使用 Application.Caller 似乎有问题。出于某种原因,它返回一个负整数,而不是它应该返回的范围对象。这是为什么?我怎样才能只获取范围对象?

以上是关于如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

创建指向另一个 Excel 工作表单元格的链接,并查找最后一个单元格值

如何从资产中获取不同的图像并将其分配给不同表格视图单元格中的图像视图

忽略其中包含公式的空单元格值

如何从 SQL 表中动态获取单元格值?

如何打开模态 jquery 并从表中获取单元格值?

使用 Javascript/jquery 如何从选定行中的每个单元格获取值