繁体   English   中英

如何在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,后期绑定代码不是什么大问题,因此我将继续分发而无需OfficeDialog的FileDialog,并使用上述后期绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM