Сбой Excel в пользовательской DLL, когда вызов UDF основан на выводе другого UDF

Я написал файл 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<>.

Меня это беспокоит уже много дней. Надеюсь, кто-нибудь может мне помочь.

Заранее спасибо.

0

Решение

Спасибо за все ответы. Я понял это.

Файл падает, потому что моя функция 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]