首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Excel-DNA中将对象从UDF参数转换为Excel范围?

如何在Excel-DNA中将对象从UDF参数转换为Excel范围?
EN

Stack Overflow用户
提问于 2018-08-09 12:26:20
回答 3查看 1.3K关注 0票数 2

我正在开发一个简单的插件使用Excel-DNA。我已经写了一个下面的函数,但是我发现很难将它转换成一个Range对象。我试着用谷歌搜索也没能找到答案。有人能帮帮我吗?

代码语言:javascript
复制
[ExcelFunction(Description = "Excel Range")]
public static string Concat2([ExcelArgument(AllowReference = true)] object rng)
{
    try
    {
       // Assuming i am calling this from Excel cell A5 as =Concat2(A1:A2)
        var app = (Excel.Application)ExcelDnaUtil.Application;
        var r = app.Range[rng, Type.Missing];

        return r.Cells[1,1] + r.Cells[2,2]
    }

    catch (Exception e)
    {
        return "Error";
    }
}
EN

回答 3

Stack Overflow用户

发布于 2018-08-10 15:37:52

您应该直接从输入参数中获取值,而不是获取Range COM对象。这样做也更有效率。

然后,您的简单函数可能如下所示:

代码语言:javascript
复制
    public static object Concat2(object[,] values)
    {
        string result = "";
        int rows = values.GetLength(0);
        int cols = values.GetLength(1);
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                object value = values[i, j];
                result += value.ToString();
            }
        }
        return result;
    }

通常,您会希望检查value对象的类型,并在此基础上执行一些不同的操作。从Excel-DNA传递的object[,]数组可以包含以下类型的项:

  • double
  • string
  • bool
  • ExcelDna.Integration.ExcelError
  • ExcelDna.Integration.ExcelEmpty
  • ExcelDna.Integration.ExcelMissing (如果在没有参数的情况下调用函数,则作为=Concat2()).

如果您将签名更改为只有一个类型为object (而不是object[,])的参数,如下所示:

代码语言:javascript
复制
    public static object Concat2(object value)

然后,根据函数的调用方式,您可能会获得上述类型中的一种作为value,或者您可能会获得一个object[,]数组作为value,因此在进行迭代之前,您的类型检查看起来会略有不同。

票数 1
EN

Stack Overflow用户

发布于 2020-03-24 22:15:56

在我的F#插件中,我有一个函数可以做到这一点(我主要使用这个函数来提取日期的显示值):

代码语言:javascript
复制
[<ExcelFunction(Description="Returns what is currently displayed as text.", IsMacroType=true)>]
let DISPLAYEDTEXT ([<ExcelArgument(Description="Cell", AllowReference=true)>] rng : obj) =
    app().get_Range(XlCall.Excel(XlCall.xlfReftext, rng, true)).Text

其中app是:

代码语言:javascript
复制
let app()= ExcelDnaUtil.Application :?> Excel.Application
票数 0
EN

Stack Overflow用户

发布于 2021-01-14 18:40:51

这个怎么样?

代码语言:javascript
复制
[ExcelFunction(IsMacroType = true)]
public static double GetBackColor([ExcelArgument(AllowReference=true)] object cell)
{
    ExcelReference rng = (ExcelReference)cell;
    Excel.Range refrng = ReferenceToRange(rng);
    return refrng.Interior.Color;
}

这是helper函数

代码语言:javascript
复制
private static Excel.Range ReferenceToRange(ExcelReference xlRef)
{    
    Excel.Application app = (Excel.Application)ExcelDnaUtil.Application;
    string strAddress = XlCall.Excel(XlCall.xlfReftext, xlRef, true).ToString();
    return app.Range[strAddress];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51758843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档