【发布时间】:2011-03-19 03:17:39
【问题描述】:
我正在将带有 VBA 代码的 Access 97 DB 更新为 Access 2007。当我转换 db 文件(首先从 97 到 2002,然后到 2007)时,VBA 代码使用 Access 2007 引用的 DAO 对象。我的问题特别是两个参考:“Microsoft DAO 3.6 对象库”和“Microsoft Office 12.0 Access 数据库引擎对象库”。我在网上读到的东西说 ADE 12.0 应该取代 DAO 3.6 参考,并且只需选中 ADE 12.0 框,一切都应该工作。由于它们都为同名对象提供引用,因此不能同时检查这两个引用。但是,检查DAO 3.6框时,并使ADE 12.0盒子未选中,访问无法找到存在的“FRMLogin”表单。如果我取消选中 DAO 3.6 框并选中 ADE 12.0 框,我会收到运行时错误 13:Visual Basic“Err”对象的“类型不匹配”:
Public Function basGetString(ByVal lngStringID As Long, ParamArray varStringArgs() _
As Variant) As String
Dim intTokenCount As Integer
Dim strResString As String
On Error GoTo err_basGetString
strResString = basLoadString(lngStringID)
If Not IsMissing(varStringArgs) Then
intTokenCount = 0
Do While intTokenCount <= UBound(varStringArgs)
strResString = basReplaceToken(strResString, _
m_cstrArgToken, varStringArgs (LBound(varStringArgs) + intTokenCount),_
1, 1)
intTokenCount = intTokenCount + 1
Loop
End If
strResString = basReplaceToken(strResString, m_cstrVBCRLFToken, vbCrLf, -1, 1)
basGetString = strResString
exit_basGetString:
Exit Function
err_basGetString:
Err.Raise Err.Number, "basGetString", Err.Description
End Function
调试器指向倒数第二行:
Err.Raise Err.Number, "basGetString", Err.Description
我已经成功地消除了记录集对象的歧义,这解决了代码中的许多其他引用冲突:Dim rs As DAO.Recordset or Dim rs As ADODB.Recordset,但这不适用于 Err 对象。 -也就是说,我尝试将 Err 对象重写为 DAO 错误对象。我也无法在 VB 编辑器中找到解决此引用错误的另一个引用,但也不与其他 ADE 12.0 引用冲突。所以,我不明白为什么选中 ADE 12.0 框并不能解决我的所有问题。而且我在弄清楚如何重写代码以便它引用 ADE 12.0 库时遇到了麻烦。最后,ADE 12.0 引用实际上指向以下文件夹中的 ACEDAO.DLL:C:\Program Files\Common Files\Microsoft Shared\OFFICE12。任何建议将不胜感激。
【问题讨论】:
-
如果您在 A2007 中运行,则需要使用 ADE 引用(这只是 DAO 的下一个版本——如果您不相信,请查看 DLL 名称)。如果在检查时仍然出现编译错误,那么这意味着它没有注册(您可以使用 regsvr32 手动注册)或者您有不同的参考问题。请张贴您的参考清单。我敢打赌,其中几个是完全没有必要的。此外,如果您正在运行多个版本的 Access,则需要让每个版本都完成注册(即安装),然后再打开任何文件。
-
如果您只检查 ADE 12.0,您的代码是否可以正确编译?
-
@David-W-Fenton 你到底为什么不把它放在答案而不是评论中?!
-
因为它基本上是一个澄清请求,而不是一个实际的答案。
-
这段代码没有问题,这只是 Access 的不良行为。这不是我第一次看到 Access 给出幻像编译器错误,因为它对代码中不相关部分的某些内容不满意。我希望您按小时计费!
标签: ms-access ms-access-2007 ado vba dao