我正在开发一个简单的插件使用Excel-DNA。我已经写了一个下面的函数,但是我发现很难将它转换成一个Range对象。我试着用谷歌搜索也没能找到答案。有人能帮帮我吗?
[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";
}
}发布于 2018-08-10 15:37:52
您应该直接从输入参数中获取值,而不是获取Range COM对象。这样做也更有效率。
然后,您的简单函数可能如下所示:
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[,]数组可以包含以下类型的项:
doublestringboolExcelDna.Integration.ExcelErrorExcelDna.Integration.ExcelEmptyExcelDna.Integration.ExcelMissing (如果在没有参数的情况下调用函数,则作为=Concat2()).如果您将签名更改为只有一个类型为object (而不是object[,])的参数,如下所示:
public static object Concat2(object value)然后,根据函数的调用方式,您可能会获得上述类型中的一种作为value,或者您可能会获得一个object[,]数组作为value,因此在进行迭代之前,您的类型检查看起来会略有不同。
发布于 2020-03-24 22:15:56
在我的F#插件中,我有一个函数可以做到这一点(我主要使用这个函数来提取日期的显示值):
[<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是:
let app()= ExcelDnaUtil.Application :?> Excel.Application发布于 2021-01-14 18:40:51
这个怎么样?
[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函数
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];
}https://stackoverflow.com/questions/51758843
复制相似问题