【问题标题】:C# Written VBA Functions (COM Add-in) with Optional Argument [duplicate]带有可选参数的 C# 编写的 VBA 函数(COM 插件)[重复]
【发布时间】: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


【解决方案1】:

试试这个:

object missing = System.Reflection.Missing.Value;

 TestObj.NormalCDF(1.2, missing , missing);

【讨论】:

  • 我之所以要使用可选参数是为了方便用户,不需要输入太多。所以“失踪”的入住可能不是一个好主意。
【解决方案2】:

能否请您发布您的 VBA 代码?

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

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

     MsgBox CStr(firstValue)

End Sub

【讨论】:

  • 请看我的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2017-07-30
  • 1970-01-01
  • 2016-06-21
  • 2017-11-12
  • 2013-04-02
相关资源
最近更新 更多