Excel 使用ADODB访问打开的xls文件

Excel 使用ADODB访问打开的xls文件,excel,vba,adodb,Excel,Vba,Adodb,虽然我已经使用VBA for Excel很长一段时间了,但我有一个问题我自己无法解决。我已经在下面描述过了,希望能得到一些帮助或建议。 我使用的是Excel2007和WindowsXP,都是用最新补丁更新的 我经常使用以下代码从其他工作簿获取数据: Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=g:\source.xls;Extended Properties=Ex

虽然我已经使用VBA for Excel很长一段时间了,但我有一个问题我自己无法解决。我已经在下面描述过了,希望能得到一些帮助或建议。
我使用的是Excel2007和WindowsXP,都是用最新补丁更新的

我经常使用以下代码从其他工作簿获取数据:

Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=g:\source.xls;Extended Properties=Excel 8.0;"

Sql = "SELECT Field1, Field2 FROM [Sheet1$]"

Set rst = New ADODB.Recordset
rst.Open Sql, conn, adOpenForwardOnly

Worksheets("Results").Range("A2").CopyFromRecordset rst

rst.Close
Set rst = Nothing

conn.Close
Set conn = Nothing
尽可能简单-只需连接到文件并从中获取一些数据。只要位于公共网络驱动器(g:\source.xls)上的源文件未在另一台计算机上打开,它就可以正常工作。
当另一台计算机上的某个用户打开了该文件,并且我尝试执行以下代码时,我注意到一件我想摆脱的事情:源Excel文件在我的计算机上打开(以只读模式),并且在与该文件的连接关闭后它不会关闭。更糟糕的是,即使我手动关闭这个源文件,它也会在我的文件中留下一些垃圾,就像它从未关闭过一样:在执行了几次代码后(源文件以前已经关闭过)看到图片:


我开始相信这是一个无法解决的错误-希望我错了:)

您最好使用内置的Excel引用打开Excel数据源,而不是使用ADO连接,例如:

Dim xlApp As New Excel.Application
Dim xlWrkBk As Excel.WorkBook

xlApp.WorkBooks.Open FILENAME
Set xlWrkBk = xlApp.ActiveWorkbook

然后从这里开始

您的Excel版本是2007或更高版本

如果在提供商处使用Microsoft.ACE.OLEDB.12.0,您的问题就解决了


这实际上是一个已知的错误,请参阅:。使用VBA查询打开的Excel工作簿会导致内存泄漏,因为即使在关闭连接和清除对象时,引用也不会被释放。

为什么您认为这是更好的解决方案?我不这么认为是因为两件事:第一:打开文件比简单的ADO连接要花费更多的时间,第二:我将无法使用SQL查询,这是我使用ADO的主要原因(除非我连接打开的文件,这几乎是相同的情况)。。。我发现的唯一积极的一面是,它应该(尚未测试)摆脱我现在的“垃圾”引用,但对我来说,增加开放时间是不值得的……为什么要存储可以运行SQL的数据库样式信息;在Excel文件中,为什么不使用Access或其他专门构建的数据库程序?我喜欢这种方法的唯一原因是,您可以单步通过工作表上的不同字段,最终更轻松地捕获任何可能的不良数据。这是因为我正在处理现有用户的Excel文件。现在不是重建他们已经使用的每个文件的时候,只是为了将相同的数据放入Access。更重要的是,大多数用户不知道Access和VBA,所以他们更喜欢使用他们知道的工具,他们可以自己修改或调整,这就是Excel文件。当然,在我能做到的地方,当我从头开始设计应用程序时,我也更喜欢使用数据库,但在大多数情况下,我会尝试“集成”不同的数据源,包括.xls文件,这会导致这个问题……好吧,如果这是一个bug,那就没什么关系了。我将测试链接页面上提到的两种变通方法,并在可能的情况下尝试使用OLEDB.12。是的,这很糟糕,但它仍然是从Excel书籍中获取数据的非常有用的方法。你只需要在这里和那里做一些小的改变来回避潜在的问题。由于使用此方法访问的大多数数据都是更适合于数据库的数据,所以我通常会使用此方法将所有我想要的数据聚合到一个小access数据库中,然后发布Excel表格、PDF等。该URL导致重定向循环。尝试