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文件时显示转换器未保存文件怎么解决?