【发布时间】:2019-01-09 02:38:56
【问题描述】:
我正在开发一些 VBA COM 插件和 Excel 插件,它们的核心代码是用 C# 编写的。我想为函数设置一个可选参数,我知道这对于 C# 和 VBA 甚至 Excel WorksheetFunction 都是合法的。但是我发现最后只有 Excel 函数可以正常工作,但是 VBA 函数总是在库已经注册到 COM 插件和 Excel 插件后说类型不匹配。
这是一个简单的例子:在 C# 中我们有一些函数被调用
double NormalCDF(double x, double mu = 0, double sigma = 1);
在Excel电子表格中,我可以成功调用
NormalCDF(1.2, 2, 3)
或
NormalCDF(1.2)
两者都给出了正确的结果。但是在VBA中,下面是成功的,
TestObj.NormalCDF(1.2, 2, 3)
很好,而
TestObj.NormalCDF(1.2)
因“类型不匹配”而失败。
有人可以帮忙解决这个问题吗?
/////////////////////////////////////// ///////////////////////// 2018 年 8 月 10 日更新
请看一个简化的示例代码: 在“MyLibraryExcel.cs”中我有
...
public interface IWorksheetFunctions
{
int test(int a = 1, int b = 1);
}
...
public class WorksheetFunctions : MoodysMathUdfBase,IWorksheetFunctions, IDTExtensibility2
{
protected Application ExcelApplication { get; set; }
public int test(int a = 1, int b = 1)
{
return a + b;
}
}
在“MyLibraryVBA.cs”我有
...
public interface IExcelVBA
{
int test(int a = 1, int b = 1);
}
...
public class ExcelVBA : IExcelVBA
{
public int test(int a = 1, int b = 1)
{
return a + b;
}
}
构建项目后,两个库都已注册。在 Excel 电子表格中,我想调用
=test(2,3)
预计返回 5,然后调用
=test()
预计返回 2。
在 VBA 宏中,我有一些代码
Sub TestVBA()
range("Output1").value=TestObj.test(2,3)
range("Output2").value=TestObj.test()
End Sub
预计也会得到 5 和 2。
有趣的是,如果我运行 Excel 电子表格的两个函数(单击单元格并按 Enter),都可以正常工作,然后运行 VBA 的两个函数,只有第一个有效,第二个失败与“类型不匹配”。但是,如果我先运行 VBA,两个 test() 都可以正常工作,然后运行 Excel 电子表格的两个函数,只有第一个可以工作,第二个会显示 #Value。
【问题讨论】:
-
一些粗略的在线文章指出 COM 需要可选参数,这可能就是您看到此问题的原因。
标签: c# excel vsto excel-addins comaddin