当UDF调用基于另一个UDF的输出时,Excel在用户定义的DLL上崩溃
Excel crashes on user defined DLL when UDF call is based on the output of another UDF
我写了一个可以被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值输入。
相关文章:
- C++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 在C++中,我如何接受不同于同一行的用户输入
- 当用户超过按钮点击限制时报告
- Visual C++(VS2017)中用户定义的转换不明确
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 当用户键入分隔符时,停止getline()输入
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- RegGetValue在当前用户下找不到名称
- 当UDF调用基于另一个UDF的输出时,Excel在用户定义的DLL上崩溃