2017-10-04 35 views
1

我有一个Access 2016应用程序,可以分发给许多不熟练的用户。他们通常必须安装MS Runtime for Access。尽管方向明确,但仍有太多用户仍然发现应用程序无法打开。看起来早期绑定的对象不存在于系统上。绑定对象不存在时,不会加载或运行代码,因此甚至不可能提供良好的错误消息。如何在Access 2016中使用VBA检测对象的存在?

我现在正在尝试编写一个小程序,其中应用程序所需的所有对象都是后期绑定的,因此能够说出哪些模块丢失,如果有的话。我发现的是虽然我知道对象存在,但我的检测方法仍然失败。下面的代码是所需对象的一个​​测试示例。这个测试总是失败,我不知道为什么。我有大约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 
+0

[error 429](https://msdn.microsoft.com/en-us/library/aa231060(v = vs.60).aspx) – SeanC

+0

“失败”是什么意思 - 错误消息,错误结果,什么都没有发生?查看https://support.office.com/en-us/article/FileDialog-Property-8510B02D-E455-44A9-BF38-3787E6D5C8C1。也许'Set obj = Application.FileDialog(msoFileDialogFilePicker)' – June7

+0

@SeanC我已经在那个列表中。它似乎并不适用。我正在测试的所有对象都存在并在我的主应用程序中工作,它们在早期绑定。为什么在这种情况下CreateObject会失败? – LostInTheTrees

回答

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 
+0

如果某个程序在引用中断时无法启动,那么该代码如何执行? – LostInTheTrees

+0

换言之,如果引用有问题,程序是否会失败,因为无法满足引用或者第一次使用引用的引用? – LostInTheTrees

+0

我认为这段代码不适用于后期绑定(并且在引用出现问题时,使用后期绑定绑定到任何特定对象的版本通常是个好主意)。 –

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对象,但你仍然可以如上面显示广告无论如何选择迟到绑定。但是,根据我的经验,使用Office引用分发运行时是安全的,因此至少在办公室对话框中不需要延迟绑定。为了可靠性,因为在FileDialog的情况下,后期绑定代码并不是什么大问题,那么我将继续分发而不使用FileDialog的办公室参考,并使用上述后期绑定。

相关问题