2016-04-01 2 views
1

это примерный подраздел для программной установки библиотеки типов для API. Почему процедура обработки ошибок не работает? Я попытался следовать стратегии try...except...finally, с которой я знаком с Python.Excel VBA On Обработка ошибок с пользовательским типом

Sub CopyViewLayout(): 

'TRY: 
On Error GoTo addReference 
    Dim App As femap.model 
    'COMPILE ERROR: USER TYPE NOT DEFINED 

ResumeSub: 
    Dim App As femap.model 
    Set App = GetObject(, "femap.model") 
    Dim rc As Variant 
    Dim feView As femap.View 
    Set feView = App.feView 
    rc = feView.Get(0) 

Exit Sub 

'EXCEPT: 
addReference: 
    Dim vbaEditor As VBIDE.VBE 
    Dim vbProj As VBIDE.VBProject 
    Dim checkRef As VBIDE.Reference 
    Dim filepath As String 

    Set vbaEditor = Application.VBE 
    Set vbProj = ActiveWorkbook.VBProject 

    filepath = "C:\apps\FEMAPv11\" 

    On Error GoTo Failure 
    vbProj.References.AddFromFile (filepath & "femap.tlb") 
    Set vbProj = Nothing 
    Set vbaEditor = Nothing 
    GoTo ResumeSub 

'FINALLY 
Failure: 
    MsgBox ("couldn't find type library, exiting sub") 

End Sub 

EDIT

Я сломала этот раздел из основной, так как обработка ошибок, это просто смешно в VBA ... Лучший подход для меня было реализовать конечно-машинка используя булевы ,

ответ

Sub refcheck() 
Dim i As Long 
Dim FEMAP_GUID As String 
FEMAP_GUID = "{08F336B3-E668-11D4-9441-001083FFF11C}" 
With ActiveWorkbook.VBProject.references 
    For i = 1 To .Count 
     If .Item(i).GUID = FEMAP_GUID Then 
      Exit For 
     Else 
      'note: filepath is determined using Dir() elsewhere... 
      .AddFromFile (filepath & "femap.tlb") 
      Exit For 
     End If 
    Next 
End With 
End Sub 
+1

Обработка ошибок в VBA не работает, как 'try ... catch' - попытка имитировать это вызовет только боль и страдания. [Обработать ошибки времени выполнения так, как они должны быть] (http://stackoverflow.com/a/30489275/1188513) –

+0

Обработка ошибок, вероятно, самая сложная задача для меня. Чтобы решить эту проблему, я нарисовал схему блок-схем/маршрутов моих зависимостей и подмножеств и создал набор логических логических модулей, которые действуют как «ключи» в «ворота», где ворота являются ключевыми зависимыми вызовами в главном. –

+0

Редактирование ответа в вопросе поражает характер Q & A переполнения стека. Возможно, вам стоит вместо этого отправить ответ. –

ответ

1

Обработка ошибок обрабатывает только ошибки во время выполнения; не компилировать ошибки времени. Использовать

Dim App as Object 

И удостоверьтесь, что вы только Dim App один раз в вашем коде.

Используя As Object, вы можете опоздать, связать с ним любой объект. Вы теряете Intellisense, в то время как вы задумываетесь.

1

Как упомянутый Дик, используйте Late Binding, но этого недостаточно. Вам придется использовать его с правильной обработкой ошибок.

Например

Dim App As Object 

On Error Resume Next 
Set App = GetObject(, "femap.model") 
On Error GoTo 0 

If App Is Nothing Then 
    MsgBox "Please check if femap is installed" 
    Exit Sub 
End If 

' 
'~~> Rest of the code 
' 

Если вы уверены, что он установлен, то вы получаете сообщение об ошибке, поскольку соответствующая библиотека не ссылается. Для этого я бы рекомендовал посмотреть на How to add a reference programmatically

Я бы все же предположил, что вы берете маршрут позднего переплетения.