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

时间:2017-10-04 18:53:17

标签: vba ms-access access-vba late-binding

我有一个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

2 个答案:

答案 0 :(得分:0)

您正在尝试检测损坏的参考文献。这是检查和报告损坏的参考文献的程序:

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

答案 1 :(得分:0)

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

但是,如果您计划在没有办公室参考的情况下分发您的应用程序(我认为您可以安全地执行此操作 - 即使使用运行时),那么您可以将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对象使用,但您仍然可以如上所示采用后期绑定。但是,根据我的经验,使用办公室参考分发运行时是安全的,因此至少对于办公室对话框,您不需要后期绑定。为了可靠性,因为在FileDialog的情况下,后期绑定代码并不是什么大问题,那么我将继续分发没有FileDialog的office引用并使用上面的后期绑定。