Excel VBA DBEngine.CreateWorkspace 失败说无法加载 DLL

Posted

技术标签:

【中文标题】Excel VBA DBEngine.CreateWorkspace 失败说无法加载 DLL【英文标题】:Excel VBA DBEngine.CreateWorkspace fails saying cannot load DLL 【发布时间】:2015-11-21 03:31:38 【问题描述】:

我有一个在 Excel 中用 VBA 编写的旧式业务应用程序。它使用 VBA DAO 库(安装在 c:\program files (x86)\Common Files\Microsoft Shared\DAO\dao360.dll)和类 WorkspaceDatabaseDBEngineConnection)通过 ODBC 连接到 SQL 数据库。

在 Windows 7 之前它可以正常工作,但在 Windows 8 /Server 2012 上,它在第一次调用 DAO 时不起作用:

Set ws = DBEngine.CreateWorkspace(wsName, "", "", dbUseODBC)

引发运行时错误号 3633 描述 "Cannot load DLL: 'msrdo20.dll'"。这发生在类库的 DBEngine.Errors 和常规 VBA Err 对象中。

无论文件msrdo20.dll是否存在,都会发生此错误。

我发现 https://support.microsoft.com/en-us/kb/260369 它说包括 ODBCDirect,但这似乎不相关。

我发现 http://www.xtremevbtalk.com/archive/index.php/t-172385.html 这建议从引用中删除 Microsoft DAO 3.6 并切换到 DAO 3.5 - 但这样做会更糟,我收到运行时错误 429,“ActiveX 组件无法创建对象”。

这是 Windows Server 2012、Excel 2013。

【问题讨论】:

您是否在不同的操作系统上使用相同的架构?你也是通过 Tools->References 加载 dll 还是使用 Declare 加载DLL的不是我的代码;它是从 DAO 包 (dao360.dll) 中动态加载的。它似乎是一个需要注册的 COM DLL。 【参考方案1】:

这个博客为我解决了这个问题:

http://pwaldman.com/unable-to-load-msrdo20-dll-or-rdocurs-dll/

摘录:

分辨率

    下载 Visual Basic 6.0 的 Service Pack 6 (Vs6sp6.exe)

http://www.microsoft.com/en-us/download/details.aspx?id=9183

    运行 Vs6sp6.exe 并解压文件 打开 msrdo20.cab,它包含以下文件:MSRDO20.DLL、MSRDO20.INF 和 RDOCURS.DLL。解压所有三个文件,并将它们复制到 C:\Windows\SysWOW64\ 目录。

    打开提升的(管理员)命令提示符,导航到 C:\Windows\SysWOW64,然后注册 MSRDO20.DLL。 RDOCURS.DLL 不需要注册。

     C:\Windows\System32> cd C:\Windows\SysWOW64
     C:\Windows\SysWOW64> regsvr32 MSRDO20.DLL 
    

【讨论】:

非常感谢!我发现我必须注册 MSRDO20.dll,但我不知道下载它的正确方法(谷歌搜索只会导致几十个看起来像垃圾邮件的网站) 提示:请务必阅读上述答案中的 elevated 命令提示符 - 即以管理员身份运行命令提示符!我花了一些时间才弄清楚这一点。 该文件夹在 Windows 10 中称为 SysWOW64(而不是 Sys64WOW【参考方案2】:

我在使用 regsvr32 时忘记以管理员身份运行命令提示符。这就是 VBA 无法找到 DLL 的原因。

【讨论】:

以上是关于Excel VBA DBEngine.CreateWorkspace 失败说无法加载 DLL的主要内容,如果未能解决你的问题,请参考以下文章

java 调用excel vba

选了一门叫excel vba的课,是干啥的

excel vba 运行速度慢

Excel 请问如何破解VBA工程不可查看

excel vba 调用ADODB 问题?

vbscript [Excel VBA中的时间戳]在Excel VBA #Excel VBA中创建时间戳字符串