如何从另一个工作表中获取单元格值并将其分配给 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 工作表单元格的链接,并查找最后一个单元格值