我正在开发一些 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。