DAO.DBEngine 类不再使用 Windows 10 在 MS Access 2016 中注册

Posted

技术标签:

【中文标题】DAO.DBEngine 类不再使用 Windows 10 在 MS Access 2016 中注册【英文标题】:DAO.DBEngine Class No Longer Registered in MS Access 2016 using Windows 10 【发布时间】:2020-12-20 23:16:55 【问题描述】:

客户端最近从 Windows 7 升级到 10 并从 Access 2013 移动到 2016(包含在 Office 365 中)。

Excel 中的 VBA 宏现在会生成以下错误:

“运行时错误 '-2147221164 (80040154)' 类未注册。”在线:

 Set myEngine = New DAO.DBEngine

我确认 DAO 3.6 包含在资源中。一个网站建议“修复”Office 安装,但我没有成功。

这个response 建议迁移到 ADO,如果我能找到一些如何这样做的例子,我可能会愿意。

以下是相关代码:

Option Base 1
Sub importPLCDataFromAccess(monthToImport As Date)

'This sub imports Influent and Effluent Data from the Access Database PLC_Data.mdb
'   This database reads records from the PLC board on a daily basis and was created
'    using Automation Direct's PointOfView software for interfacing with PLC Boards

Dim myDbLocation As String
myDbLocation = "K:\Users\WWTP Computer\Documents\POV_Projects\PLC Interface\PLC_Data.mdb"

Dim myWorkbook As Workbook

'Skip spurious stuff ... 

Dim myEngine As DAO.DBEngine
Dim myDB As DAO.Database
Dim myRecordSet As DAO.Recordset
Dim myWorkSpace As DAO.Workspace

'Skip more spurious stuff ... 

Set myEngine = New DAO.DBEngine ' This is the offending line

Set myDB = myEngine.OpenDatabase(myDbLocation)

似乎我在这里遗漏了一些基本的东西。任何帮助表示赞赏。

【问题讨论】:

在工具\参考下,尝试用Microsoft Office #.# Access Database Engine Object Library替换Microsoft DAO 3.6 Object Library @Parfait 感谢您的提示。我将您的建议与下面的答案结合起来,解决了这个问题。 【参考方案1】:

我建议使用后期绑定来实现代码可移植性。一旦你得到这个工作,你会发现它稍后在另一台计算机上失败。将所有内容声明为对象,然后使用 CreateObject 命令根据需要拉入引用。

示例:

Public Function GetDBEngine() As Object  
    On Error Resume Next
    
    'try 120
    Set GetDBEngine = CreateObject("DAO.DBEngine.120")
    
    If Err.Number <> 0 Then
        'try 36
        Err.Clear
        Set GetDBEngine = CreateObject("DAO.DBEngine.36")
        If Err.Number <> 0 Then         
            Set GetDBEngine = CreateObject("DAO.DBEngine.35")  
            Err.Clear         
        End If        
    End If

    On Error Goto 0
End Function



Sub importPLCDataFromAccess(monthToImport As Date)
    'This sub imports Influent and Effluent Data from the Access Database PLC_Data.mdb
    '   This database reads records from the PLC board on a daily basis and was created
    '    using Automation Direct's PointOfView software for interfacing with PLC Boards

    Dim myDbLocation As String
    myDbLocation = "K:\Users\WWTP Computer\Documents\POV_Projects\PLC Interface\PLC_Data.mdb"
    
    Dim myWorkbook As Workbook
    
    'Skip spurious stuff ...
    
    Dim myEngine As Object
    Dim myDB As Object
    Dim myRecordSet As Object
    Dim myWorkSpace As Object
    
    'Skip more spurious stuff ...
    
    Set myEngine = GetDBEngine
    
    Set myDB = myEngine.OpenDatabase(myDbLocation)
    

脚注:

当我们在这里的时候,我可以说服你离开Option Base 1 吗?当然,还有其他方法可以让您的代码从 1 开始,而不会违反时空连续体。

【讨论】:

感谢您的回答。唯一让我担心的是我找不到任何文档来指导我何时根据“win version”更改“120”。附言选项 1 来自于在纸上进行矩阵乘法的多年!可以将我的用户名更改为“MatrixBender” 看起来 120 在所有较新版本的 office 上都可用。旧版本是3536。我添加了一些代码来提供帮助。

以上是关于DAO.DBEngine 类不再使用 Windows 10 在 MS Access 2016 中注册的主要内容,如果未能解决你的问题,请参考以下文章

在 VB6 中将 DAO DBEngine DataTable 的列从 DataType dbInteger 更改为 dbLong

$(window).scroll(function () 不再在 chrome 和 firefox 中工作

Spring Boot 在命令行指定主类启动程序

window.alert() 后无法编辑输入文本字段

Scala window下安装

window 上安装 Scala