当UDF调用基于另一个UDF的输出时,Excel在用户定义的DLL上崩溃

Excel crashes on user defined DLL when UDF call is based on the output of another UDF

本文关键字:UDF 用户 定义 DLL 崩溃 Excel 调用 另一个 输出      更新时间:2023-10-16

我写了一个可以被Excel使用的dll文件,但是我的电子表格在某些情况下崩溃了。如果有人能帮助我,我会很感激。

我使用的c++代码如下:(很大程度上借用了c++包QuantLib)

long __stdcall nextBusinessDay_C(long todaySerial) {
    Date today(todaySerial);
    UnitedStates us(UnitedStates::NYSE);
    return (long)(us.advance(today,1,Days).serialNumber());
}

在Excel中,我有以下VBA代码

Declare Function yz_nextBusinessDayUS_NYSE_C Lib _
    "c:libmyExcelFile.dll" _
(ByVal ds As Long) As Long
Function nextBizDayUS(d As Date) As Date
    nextBizDayUS = nextBusinessDayUS_C(CLng(d))
End Function

现在,在Excel中,如果我只用:

//This works perfectly fine
A1: 1/1/2013         B1: =nextBizDayUS(A1)
A2: 1/2/2013         B2: =nextBizDayUS(A2)
A3: 1/2/2013         B3: =nextBizDayUS(A3)
...                  ...

我可以继续这样写几千行没有任何问题。但是,如果我使用一个函数的输出作为另一个函数的输入,每次当我按Ctrl+Alt+F9:

时,我的Excel都会崩溃。
//This crashes every time when I hit Ctrl+Alt+F9!!!
A1: 1/1/2013
A2: =nextBizDayUS(A1)
A3: =nextBizDayUS(A2)

在我的c++库中使用的源代码与QuantLib包完全相同(我只是想学习这个包,而不是推销我自己的代码)。代码使用的唯一花哨的东西是boost::shared_ptr<>。

我已经为此烦恼了许多天了。希望有人能帮帮我。

感谢大家的回复。我明白了。

文件崩溃,因为我的c++函数在接受0值作为输入日期时抛出异常。在excel中,如果我有以下表格:

A1: 1/1/2013
A2: =nextBizDayUS(A1)
A3: =nextBizDayUS(A2)

一旦我按Ctrl+Alt+F9, nextBizDayUS将按以下顺序计算3次:

=nextBizDayUS(0)  'cell A3
=nextBizDayUS(A1)  'cell A2
=nextBizDayUS(A2)  'cell B3

不知道为什么Excel会这样做,但为了解决这个问题,我只需要在我的c++函数中添加一个特殊情况来处理0值输入。