Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个工作表中获取单元格值并将其分配给UDF的返回值?_C#_Excel_Range_User Defined Functions - Fatal编程技术网

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

C# 如何从另一个工作表中获取单元格值并将其分配给UDF的返回值?,c#,excel,range,user-defined-functions,C#,Excel,Range,User Defined Functions,这是我的两张工作表的一个小例子 原件: 如您所见,此工作表有两个单元格等待在稍后阶段重新计算。(即带有红色#评估标记的细胞) 结果表: 在上面的结果表中,我们得到了两个结果,草莓和桃子。这两个结果是为两个#Eval细胞准备的,需要替换#Eval标记 请注意#Eval实际上是由UDF返回的,表示需要重新计算此单元格。重新计算将通过单击按钮或其他方式手动启动 还要注意的是,位置映射到两个表中——如果#Eval位于单元格A3中,那么结果表中的单元格A3中也会显示一个结果 因此,我的主要目标是用相应

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

原件

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

结果表

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

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

还要注意的是,位置映射到两个表中——如果#Eval位于单元格A3中,那么结果表中的单元格A3中也会显示一个结果

因此,我的主要目标是用相应的结果替换#Eval cell。但是我在将结果传递到我的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;
}
//将结果表中的值分配回结果变量
私有字符串getResultFromResultSheet(Excel.Worksheet原始工作表,Excel.Worksheet结果表)
{
字符串DataResult=null;
//Excel.Range resultSheetRange=resultSheet.UsedRange;
//string Address=resultSheetRange.get_Address(Type.Missing,Type.Missing,Excel.XlReferenceStyle.xlA1,Type.Missing,Type.Missing);

Excel.Range originalSheetRange=originalSheet.UsedRange;//调用应用程序。自定义项中的调用方将返回调用单元格的范围对象。然后,您的自定义项可以从另一个表中的相应位置读取数据。

我个人会重新考虑,并按照Excel期望的方式编写自定义项财政司司长:

  • 将单元格中的所有数据作为参数传递到自定义项中(如果不这样做,Excel不知道何时重新计算自定义项,您将不得不使自定义项不稳定,这是一个坏主意)
  • UDF应将其结果返回到其占用的单元格
  • 正如Govert所说:如果您需要UDF占用的单元格的range对象(通常是为了找出调用范围的维度),您可以使用Application.Caller
  • 不要使用.Text(它提供单元格的格式化结果,该结果取决于用户所做的任何操作,并且可能包含####)而使用.Value2
然后,原始工作表中的自定义项=DataResult(ResultSheet!A1)


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

非常感谢您的帮助。不过,还有一个问题,我在使用.Value2时似乎存在类型转换问题。我认为如果原始数据是基于文本的值b,则可以正常工作但当涉及日期类型数据时,它将给出不正确的结果。
string result=(string)ResultRange.Value2;
是我当前使用的代码。也许我应该先将.Value2转换为对象?Excel日期值是双精度的,而不是字符串。因为Excel单元格可以包含双精度、错误、字符串或布尔值中的任何一种,所以转换为对象通常最安全,除非您希望在单元格数据不是所需类型时出错Application.Caller没有问题。它以某种方式返回-2146826265。我也在这里发布了这个问题,非常感谢。这正是我一直在寻找的。我对Excel编程还是相当新手。另外,MSDN上的一些API文档没有很好的文档记录,这使得学习/参考有点困难(我想真的需要你们的帮助。再次感谢大家的回答。使用Application.Caller似乎有问题。出于某种原因,它返回一个负整数,而不是它应该返回的范围对象。为什么?我如何只能获取范围对象?