Я написал файл dll, который может использоваться Excel, однако моя таблица дает сбой при определенных обстоятельствах. Я был бы признателен, если кто-нибудь может мне помочь.
Код 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:\lib\myExcelFile.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)
... ...
Я могу продолжать писать тысячи таких строк без каких-либо проблем. Однако, если я использую выходные данные одной функции в качестве входных данных для другой, мой Excel вылетает каждый раз, когда я нажимаю Ctrl + Alt + F9:
//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.
Других решений пока нет …