【问题标题】:Excel ComType of Application.Evaluate() on a concatenation function连接函数上 Application.Evaluate() 的 Excel ComType
【发布时间】:2011-11-09 18:00:23
【问题描述】:

在 Excel 2007 的 c# UDF 中,我需要评估 Excel 函数参数的值(不要问为什么,长篇大论)。

假设我们要评估这个 Excel 函数:

=afunctionname("2009-01-01" ; "B4" ; "foo" ; concatenate("a";"b") )

我的目标是得到一个字符串:

=afunctionname("2009-01-01" ; "B4 单元格的值" ; "foo" ; "ab" )

感谢这个 sn-p,我评估了参数的值:

Object comObject = app.Evaluate(param); //app = Microsoft.Office.Interop.Excel.Application
String value = getValueFromComObject(comObject);

getValueFromComObject 详细信息:

private static String getValueFromComObject(Object comObject)        {
    if ((comObject as Range) != null)
                {
                    Range rge = ((Range)comObject);

                    switch (Type.GetTypeCode(rge.Value.GetType()))
                    {
                        case TypeCode.DateTime:
                            return ((DateTime)rge.Value).ToShortDateString();
                        default:
                            return rge.Value.ToString().Trim();
                    }
                }
                else
                {
                    return comObject.ToString();
                }
}

我们示例的第一个和第三个参数直接通过 application.Evaluate 返回为 String 。第二个参数作为一个范围返回,并且由于类型转换而得到正确管理。

问题出在第四个参数上,我不知道我必须在评估连接函数时应用的女巫类型,它显然不是一个范围,toString() 给了我参考:-2146826273

有什么想法吗?

【问题讨论】:

  • 不确定 C# 但在 VB 中您可以使用 TypeName 或 .GetType.ToString(或类似的东西)来确定它是什么类型的对象。
  • 这是错误代码 2015,“类型不匹配”。可能与尝试将函数转换为字符串有关,不确定。
  • 在 VBA 中 typename(application.Evaluate("concatenate(""a"",""b"")")) 给出“字符串”。我不知道为什么您的 app.evaluate 不会给出类似的结果...
  • Evaluate 有很多怪癖:您可能会发现这篇博文很有用 fastexcel.wordpress.com/2011/11/02/…

标签: c# excel function vsto evaluate


【解决方案1】:

好的,我发现了问题:)!

首先返回类型是一个Int32,返回值对应错误码#value根据这个页面:How to know if a cell has an error in the formula in C#

实际上,字符串的长度对于 eval 模式下的 concatenate 函数来说太长了,我在 Excel 中尝试过它可以工作,但是使用 eval 它给了我一个错误。所以我只需要减少连接方法中每个字符串的长度(添加更多参数)就可以了。

感谢大家的帮助。

【讨论】:

    【解决方案2】:

    在 C Sharp 中,要计算我们在字符串 "," 中设置的公式,以分隔参数。在本机 excel 应用程序中,我们输入“;”。为了评估静态值(例如: CONCATENATE("a","b") ),我们使用“Application.Evaluate”方法。为了评估单元格中的值(例如: CONCATENATE(A1,B1) ),我们使用 Application._Evaluate。

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2020-12-22
      • 2011-05-29
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多