如何在 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 参考并使用上面的后期绑定。
我有一个 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 参考并使用上面的后期绑定。