VB6 程序无法打开 Excel 2007,未注册自动化错误库

Posted

技术标签:

【中文标题】VB6 程序无法打开 Excel 2007,未注册自动化错误库【英文标题】:VB6 program fails opening Excel 2007 with Automation Error Library not registered 【发布时间】:2014-07-30 05:36:12 【问题描述】:

我在装有 Office 2010 32 位的 Windows 7 32 位机器上创建了这个 VB6 程序,它运行良好。在装有 Office 2013 32 位的 Windows 8 64 位机器上对其进行了测试,它可以工作。在一台装有 Windows 7 64 位和 Office 2007(仅限 32 位)的机器上,它会在以下代码段中引发错误。

实际的错误信息:

运行时错误 –2147319779 (8002801d) 自动化错误,库不是 已注册

VB6 代码:

If (excel_app Is Nothing) Then
    Set excel_app = CreateObject("Excel.Application")
Else
    Set excel_app = GetObject(, "Excel.Application")
End If

excel_app.Visible = True
excel_version = excel_app.Application.Version
Set wBook = excel_app.Workbooks.Open(directory_path & "\templates\book1.xlsm")

所以当我打开 book1 时它会抛出错误。它实际上确实打开了它,并且它在 Workbook_Open() 上运行了一个宏,这看起来很好。在它完成并且程序的处理返回到 VB6 程序后,它会抛出错误。

以下是项目参考:

有人遇到过这个问题吗?解决办法是什么?

[编辑]

我显然做错了,我的错误处理程序抛出了一个错误。

我确实尝试了另一件事,它被删除了“Set wBook =”并且它没有引发错误。从那时起,我已经放置了“Set wBook =”,因为我确实需要在我的代码中进一步使用它。

    Dim wBook As Workbook
    Dim excel_app As Object

    On Error GoTo trialhandler

    If (excel_app Is Nothing) Then
        Set excel_app = CreateObject("Excel.Application")
    Else
        Set excel_app = GetObject(, "Excel.Application")
    End If

    excel_app.Visible = True
    excel_version = excel_app.Application.Version
    Set wBook = excel_app.Workbooks.Open(directory_path & "\templates\book1.xlsm")

    MsgBox ("Exiting")
    Exit Sub
trialhandler:

    Dim source_string As String
    source_string = excel_app.Source 'Error here
    MsgBox ("My Error 1:" & source_string)
    excel_app.Err
    MsgBox ("My Error 2:" & excel_app.Err.Number & "  " & excel_app.Err.Description)

    Exit Sub

我之前在上面安装了Office 2013,然后卸载它并在上面放置了2007,这会有什么影响吗?或者我已经参考 Excel 2010 创建了这个程序,现在我正试图针对 Office 2007 运行它?虽然它可以在 2013 年的另一台机器上运行。在这里抓住稻草。

[编辑 2]

它已经通过了初始错误,以后会抛出完全相同的错误。这篇文章导入了一个 mdb 表。一定还有一些早期的绑定遗留下来

    With wBook.Worksheets("Seal Register").ListObjects.Add(SourceType:=0, Source:=Array( _
        "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & db_full_path & ";" _
        , _
        "Mode=ReadWrite;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";" _
        , _
        "Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;" _
        , _
        "Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;" _
        , _
        "Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;" _
        , _
        "Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False"), _
        Destination:=Range("A" & row_number)).QueryTable
        .MaintainConnection = False
        .CommandType = xlCmdTable
        .CommandText = Array(db_table_name)
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = 1
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceDataFile = db_full_path
        .ListObject.DisplayName = "Table_" & db_table_name
        .Refresh BackgroundQuery:=False
    End With

【问题讨论】:

【参考方案1】:

没有理由认为这是一个 vb 错误。

返回或设置最初产生错误的对象或应用程序的名称。

object.Source [= stringexpression]

参数 目的 总是 Err 对象。

字符串表达式 表示产生错误的应用程序的字符串表达式。

备注 Source 属性指定一个字符串表达式,该表达式通常是导致错误的对象的类名或编程 ID。当您的代码无法处理访问对象中生成的错误时,请使用 Source 为您的用户提供信息。例如,如果您访问 Microsoft Excel 并生成除以零错误,Microsoft Excel 将 Err.Number 设置为该错误的错误代码,并将 Source 设置为 Excel.Application。请注意,如果错误是在 Microsoft Excel 调用的另一个对象中生成的,Excel 会截取错误并将 Err.Number 设置为它自己的代码,即除以零。但是,它将其他 Err 对象(包括 Source)保留为由生成错误的对象设置。

Source 始终包含最初产生错误的对象的名称——您的代码可以尝试根据您访问的对象的错误文档来处理错误。如果您的错误处理程序失败,您可以使用 Err 对象信息向您的用户描述错误,使用 Source 和另一个 Err 来告知用户最初是哪个对象导致了错误,它对错误的描述等等。

从自动化 Microsoft Office 97 和 Microsoft Office 2000 洛瑞·特纳 微软公司

2000 年 3 月

问题: 我的自动化客户端在我的应用程序的 Office 97 版本中运行良好。但是,我重建了我的项目,它在 Office 2000 上运行良好,但现在在 Office 97 上失败了。可能出了什么问题?

新版本的 Office 包含新功能并增强了一些现有功能。为了向客户提供对这些新功能和增强功能的编程访问,必须更新对象模型。由于此更新,Office 2000 的方法可能比 Office 97 具有更多的参数。

现有方法的新参数通常是可选的。如果您使用后期绑定到 Office 自动化服务器,您的代码应该可以在 Office 97 或 Office 2000 上成功运行。但是,如果您使用早期绑定,则 97 和 2000 类型库之间的差异可能会导致您在以下情况下出现问题:

如果您在 Visual Basic 中创建自动化客户端并引用 Office 2000 类型库,如果您调用已更改的方法或属性,则在使用 Office 97 服务器时您的代码可能会失败。

如果您创建 MFC 自动化客户端并使用 ClassWizard 包装 Office 2000 类型库中的类,如果您调用已更改的方法或属性,则在使用 Office 97 服务器时您的代码可能会失败。 为避免此问题,您应该针对您打算支持的最低版本的 Office 服务器开发您的自动化客户端。为了在保持与多个 Office 版本的兼容性方面获得最佳结果,您应该使用后期绑定。但是,如果您选择使用早期绑定,请绑定到您想要支持的最早版本的 Office 服务器的类型库。举例来说,如果您正在使用 Visual Basic 编写自动化客户端并希望该客户端使用 Excel 97 和 Excel 2000,则应在 Visual Basic 项目中引用 Excel 97 类型库。同样,如果您使用 MFC 编写自动化客户端,您应该使用 ClassWizard 来包装 Excel 97 类型库。

有关详细信息,请参阅 Microsoft 知识库中的以下文章:

Q224925 信息:Office 2000 的类型库已更改

【讨论】:

谢谢,我会添加一些错误处理,看看我想出了什么。 在获取源代码时遇到了一些问题。我在上面的问题中提出了Edit,反映了这一点。 使用vb的err对象,应该和excel的一样 好的,谢谢。错误来源说 Project1 所以我猜它确认它来自 VB6 程序。我将在开发机器上安装 Office 2007,然后更改我的引用并再次编译。 也许将 wbook 更改为 as object 可能就足够了。

以上是关于VB6 程序无法打开 Excel 2007,未注册自动化错误库的主要内容,如果未能解决你的问题,请参考以下文章

office2013安装后 右键新建excel无法打开 如下图所示

我安装的是EXCEL2003版和07兼容包,,,,,在打开.xlsx文件时显示转换器未保存文件怎么解决?

从VBA Excel 2007打开与MySQL的连接

未在本机注册Microsoft.ACE.OleDb.12.0

新人请教:导入excel提示未找到提供程序

windows7如何在右键新建菜单里添加excel2007怎么添加呀