如何在 Access 2016 中使用 VBA 检测对象的存在?

How do I detect the presence of objects using VBA in Access 2016?

我有一个 Access 2016 应用程序,该应用程序已分发给许多不是高级用户的用户。他们通常必须安装 MS Runtime for Access。尽管有明确的指示,但仍有太多用户发现应用程序无法打开。系统上似乎不存在早期绑定对象。如果绑定对象不存在,则不会加载或运行任何代码,因此甚至不可能给出正确的错误消息。

我现在正在尝试编写一个小程序,其中应用程序所需的所有对象都是后期绑定的,因此能够说出缺少哪些模块(如果有的话)。但我发现,即使我知道物体存在,我的检测方法也会失败。下面的代码是对所需对象进行一次测试的示例。这个测试总是失败,我不知道为什么。我有大约7个。三个似乎工作正常,但其他人没有。是否有一些不同的方式来编码 "CreateObject"?

Private Sub btnOffice_Click()
    'Office    FileDialog    MSO.DLL       Microsoft Office 16.0 Object Library
    Dim obj As Object

    On Error GoTo xyzzy
    Set obj = CreateObject("Office.FileDialog")
    lblOffice.Caption = "Office module present"
    Exit Sub
xyzzy:
    lblOffice.Caption = officeWarning
    MsgBox Err.Description
End Sub

您正在尝试检测损坏的引用。以下是检查和报告损坏引用的过程:

Sub CheckReferences()
    Dim ref As Reference

    For Each ref In References
        If ref.IsBroken Then
            MsgBox "Broken reference detected: " & vbCrLf & ref.Name & vbCrLf & ref.FullPath, vbOKOnly + vbCritical, "Broken Reference"
        End If
    Next ref
End Sub

这里的问题是文件对话框不能作为单独的 COM 对象使用,因此您不能使用 CreateObject() 来创建这样的实例。

但是,如果您计划在没有 office 引用的情况下分发您的应用程序(我认为您这样做是安全的 – 即使有运行时),那么您可以将 FileDialog 代码更改为后期绑定:

例如:

Dim f    As FileDialog
Set f = Application.FileDialog(msoFileDialogFilePicker) 
f.Show 
MsgBox "file choose was " & f.SelectedItems(1)

变成这样:

Dim f    As Object 
Set f = Application.FileDialog(3) 
f.AllowMultiSelect = True 
f.Show 
MsgBox "file choosen was " & f.SelectedItems(1)

所以在您的情况下,filedialog 不能作为单独的 COM 对象使用,但您仍然可以如上所示采用后期绑定。但是,根据我的经验,使用 office 引用分发运行时是安全的,因此至少对于 office 对话框,您不需要后期绑定。为了可靠性,因为在 FileDialog 的情况下,后期绑定代码不是什么大问题,那么我将继续分发而不使用 FileDialog 的 office 参考并使用上面的后期绑定。