2012-01-12 2 views
3

У меня есть книга, которая использует определенный тип, назовем ее T, это в модуле (DLL), определенном в моих ссылках, - все хорошо.Ошибка компиляции во время работы книги

Я создал код, который вызывается в Workbook_Open(), который добавит ссылку на DLL, если ее еще нет в списке ссылок. Это так, что я могу дать книгу кому-то, и им не придется заниматься созданием ссылки вручную.

Проблема заключается в том, что, когда я открываю книгу (дважды щелкните), перед выполнением Workbook_Open() (и может быть установлено Refence), я получаю бросок в отладчик, который указывает и жалуется, что тип T, определенный в DLL, не связанная с показом, не определена. Ну, не шучу, это не так.

Это кажется немного цыпленком и яйцом. Кто-нибудь видел это раньше? Как ты это починил?

+0

Используете ли вы тип T где-нибудь в коде workbook_open (или в любом из объектов рабочего листа?). Во время компиляции он проверяет, хорошо ли типизированные объекты. один из способов обойти это - отказаться от сильной печати ваших объектов T. – Pynner

+1

Как предлагает @Pynner, используйте позднюю привязку. Поэтому вместо объявления переменной типа T объявить как '' Object''. –

+0

В дополнение к тому, что предложила Рейчел. У пользователя также есть эта DLL? Он зарегистрирован на его компьютере? –

ответ

1

Как и другие люди, если вы не собираетесь добавлять ссылку на DLL до Workbook_Open, вы должны использовать позднюю привязку для подключения к материалам в DLL.

Однако, я думаю, вы идете об этом неправильно. Вместо того, чтобы добавлять ссылку на DLL в Workbook_Open, попросите его уже ссылаться и вместо этого наберите .IsBroken. Затем вы можете сделать код, чтобы сделать то, что когда-либо понадобилось для исправления неисправной ссылки.

Это сохраняет преимущество раннего связывания, и вы не получите ошибки компиляции такого же типа, если ссылка на DLL будет нарушена.

ПРИМЕЧАНИЕ: Вы все еще можете получить ошибки компиляции, но они не будут отсутствовать в DLL. Несмотря на то, что у вас есть неработающая ссылка, любое использование функций из модуля VBA Strings вызовет ошибку компиляции, если функция не предваряется Strings.. Например, следующий код вызовет ошибку компилятора перед запуском Workbook_Open, если у вас есть какие-либо неисправные ссылки ,

Private Sub Workbook_Open() 
    Dim r As Reference 
    For Each r In ThisWorkbook.VBProject.References 
     If r.IsBroken Then 
     MsgBox "Found broken reference." & vbCrLf _ 
       & Mid(r.FullPath, InStrRev(r.FullPath, "\") + 1) 
     End If 
    Next r 
End Sub 

Чтобы исправить, префикс Mid и InStrRev с Strings..

MsgBox "Found broken reference." & vbCrLf _ 
    & Strings.Mid(r.FullPath, Strings.InStrRev(r.FullPath, "\") + 1) 
Смежные вопросы