Из пользовательской функции в вашем XLL вы должны перехватывать исключения. Вы должны использовать обработчик catch, чтобы поймать все. Это запах кода, но убедитесь, что любая запись в журнал или другая обработка ошибки в перехвате не генерируются, обернув это пустым обработчиком перехвата.
То же из потока пользовательского интерфейса для любых обработчиков событий ленты.
Если вы создадите свое собственное окно, любые исключения, которые вы пропустите, будут аварийно завершаться. Если вы используете окно WPF, вы можете настроить глобальный обработчик для диспетчера во время подключения надстройки.
Dispatcher.CurrentDispatcher.UnhandledException + = CurrentDispatcher_UnhandledException;
Excel в лучшем случае привередлива, поэтому относись к ней как к dottie