Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA关于用户定义类型的错误处理_Vba_Excel - Fatal编程技术网

Excel VBA关于用户定义类型的错误处理

Excel VBA关于用户定义类型的错误处理,vba,excel,Vba,Excel,这是一个以编程方式安装API类型库的示例。为什么错误处理例程失败?我试图遵循Python中我熟悉的try…除了…最后策略 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(,

这是一个以编程方式安装API类型库的示例。为什么错误处理例程失败?我试图遵循Python中我熟悉的
try…除了…最后
策略

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
编辑

我从main中打断了这个部分,因为在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

错误处理只处理运行时错误;不是编译时错误。使用

Dim App as Object
并确保在代码中只使用一次
Dim App


通过将
用作对象
,可以将任何对象延迟绑定到它。当你编码思想时,你会失去智能感知。

就像迪克提到的那样,使用后期绑定,但光靠它是不够的。您必须在正确处理错误的情况下使用它

比如说

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
'
如果您确定它已安装,那么您将收到错误,因为未引用相关库。为此,我建议您看看


但是,我仍然建议您采用后期绑定路线。

VBA中的错误处理与
try…catch
一样无效-尝试模仿它只会导致痛苦和痛苦。对我来说,错误处理可能是最困难的挑战。为了解决这个问题,我绘制了一个依赖项和子项的流程图/路线图,并创建了一组模块范围布尔函数,作为“门”中的“键”,其中门是主要的键依赖调用。编辑问题的答案可以克服堆栈溢出的Q&a性质。。你也许应该贴一个答案。@Mat'smugh,好吧,我会的。谢谢