从宏调用的函数的 VBA 错误处理

Posted

技术标签:

【中文标题】从宏调用的函数的 VBA 错误处理【英文标题】:VBA error handling for functions called from a macro 【发布时间】:2012-06-11 10:56:09 【问题描述】:

在一个访问数据库中,我有一个在启动时调用的小函数,它注册了一个用于生成条形码的软件。

如果未安装软件,则 Microsoft 会访问运行时错误,因此我想添加一些适当的错误处理,以告知用户导致问题的原因。

此函数在启动时从宏中调用,导致数据库崩溃,而不是错误处理正常工作。

我的错误处理不正确吗?

Public Function LicenseTBarCode()
On Error GoTo Err_LicenceTBarCode

Dim TB As New TBarCode10
TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D
Set TB = Nothing
Exit Function

Err_LicenceTBarCode:
MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error
DoCmd.Quit
End Function

【问题讨论】:

您的错误代码在一般情况下是可以的,但我怀疑问题出在Dim TB As New TBarCode10。这表明您已经创建了对相关库的引用,是这样吗? 是的,有一个使用的类型库。当库不可用时会出现问题。我想如果找不到库,那么它将转到错误处理程序。 你应该阅读accessmvp.com/djsteele/AccessReferenceErrors.html 请注意,在 MS Access 中,缺少引用可能会导致问题,从而阻止看似不相关的代码运行。在大多数情况下,建议您使用后期绑定。 我同意@Remou 关于 LateBinding 的看法。我不得不删除我的答案,因为我错过了Dim 部分。 【参考方案1】:

更改您的代码以使用后期绑定:

Public Function LicenseTBarCode()
On Error GoTo Err_LicenceTBarCode

    Dim TB 
    Set TB = CreateObject("TBarCode10.TBarCode10")
    TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D
    Set TB = Nothing
    Exit Function

Err_LicenceTBarCode:
    MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error
    DoCmd.Quit
End Function

为了使其正常工作,您确实需要对所有 TBarCode 代码使用后期绑定,包括您可能正在使用的任何其他 TBarCode 对象。如果您还不熟悉后期绑定,起初理解起来可能会有些困难,尤其是在您使用任何使用工厂模式的类时。

使用后期绑定,您将取消选中对 DLL 的引用,然后您的代码需要编译而不会出现错误。使用后期绑定进行开发可能具有挑战性,因为您将无法访问 IntelliSense。最好使用 Early Binding 进行开发,然后再将代码转换为 Late Binding。

您使用后期绑定丢失的另一件事是在原始对象中定义的任何常量。您必须自己创建这些。根据您需要使用的数量以及您需要在哪里使用它们,创建一个模块来保存这些常量可能是最简单的。你真的只需要在你的代码中实际使用的常量。

Global Const eLicKindSingle = 1 'Single license for exactly one computer
Global Const eLicKindSite = 2 'Site license for an arbitrary number of computers within one site (or one facility) at one legal address
Global Const eLicKindDeveloper = 3 'Developer license for redistribution to 3rd party
Global Const eLicKindWeb = 3 'Web-server license 

Global Const eLicProd1D = 32 '(1D codes)
Global Const eLicProd2D = 33 '(2D codes)

或者,您可以只使用常量包含的值。例如:

TB.LicenseMe "<EXPUNGED>", 2, 1, "<EXPUNGED>", 32

另外,据我所知,后期绑定不适用于 ActiveX 控件。 ActiveX 控件本质上是早期绑定的。

还有另一种方法可以解决这个问题。我使用一个“starter”数据库文件来处理主数据库的一些先决条件。此入门数据库不使用任何引用。它只检查文件系统以查看是否安装了正确的文件。如果不是,它会弹出一个带有正确错误/警告的消息框,然后它会运行主数据库文件或选择不运行它,具体取决于您写入其中的逻辑。这是避免使用后期绑定的一种方法。

【讨论】:

这个答案有点奏效。未安装类型库时,数据库仍然崩溃。 抱歉,我没有在“参考”对话框中关闭“参考”。我接受这个答案

以上是关于从宏调用的函数的 VBA 错误处理的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel 简单错误处理

在 VBA 中处理错误时如何管理无错误情况? [复制]

确定 VBA 中当前错误处理方法的语法

MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?

VBA中的错误处理 - 接下来的错误恢复

错误处理中的 Excel VBA 运行时错误 1004