0

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

4

2 回答 2

0

你能发布你的VBA代码吗?

我试过下面的代码,它工作正常

Sub OptionalArgs(firstValue As Double, Optional secindValue As Double = 0)

     MsgBox CStr(firstValue)

End Sub
于 2018-08-03T11:09:59.443 回答
0

尝试这个:

object missing = System.Reflection.Missing.Value;

 TestObj.NormalCDF(1.2, missing , missing);
于 2018-08-03T11:13:51.667 回答