2011-09-22 27 views
1

这是我两个工作表的一个小例子。如何从另一个工作表中获取单元格值并将其分配给UDF的返回值?

原始表

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; 
} 

回答

2

个人而言,我会去重新思考和写你的UDF的Excel预计UDFS是这样:

  • 通从单元中的所有数据到你的UDF作为参数(如果你不这样做Excel不会知道何时重新计算您的UDF,您将不得不使UDF易变,这是一个坏主意)
  • UDF应该将结果返回给它所占用的单元格
  • Govert说:if您需要UDF占用的单元格的范围对象(通常是查找调用范围的维度),您可以使用Application.Caller
  • 不要使用。文本(即让你的电池的格式化的结果是依赖于任何用户做而且可能含有###)使用.Value2代替

然后你的UDF中原始工作表= DataResult(结果表格!A1)

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

+0

非常感谢您的帮助。但是,只有1个问题,我似乎有类型转换问题,当我使用**。Value2 **。我认为它如果原始数据是基于文本的值,那么工作正常,但是当涉及到日期类型数据时,它会给我不正确的结果。'string result =(string)ResultRange.Value2;'是我目前使用的代码。转换.Value2到对象第一? – woodykiddy

+0

Excel日期值是双打,而不是字符串 –

+0

由于Excel单元格可以包含任何一个双精度,一个错误,一个字符串或一个布尔值它是最安全的转换为对象,除非你想要一个错误,如果单元格数据不是所需的类型 –

1

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

+0

非常感谢。这正是我所期待的。我仍然是Excel编程的新手。另外,MSDN上的API文档的某些部分没有很好的记录,这使得学习/参考有点困难。 :(我猜你们需要一点帮助,再次感谢大家的回答。 – woodykiddy

+0

使用Application.Caller似乎有问题。出于某种原因,它返回一个负整数,而不是范围对象。它应该,为什么是这样?我怎样才能得到范围对象? – woodykiddy

相关问题