【问题标题】:Using ADODB to access opened xls file使用 ADODB 访问打开的 xls 文件
【发布时间】:2012-02-17 15:01:06
【问题描述】:

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

我经常使用以下代码从另一个工作簿获取数据:

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 vba adodb


    【解决方案1】:

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

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

    []的

    【讨论】:

      【解决方案2】:

      这实际上是一个已知的错误,请参阅:http://support.microsoft.com/default.aspx?scid=kb;en-us;319998&Product=xlw。使用 VBA 查询打开的 Excel 工作簿会导致发生内存泄漏,因为即使关闭连接并清除对象也不会释放引用。

      【讨论】:

      • 好吧,如果这是一个错误,那么与它没有太大关系。我将测试链接页面上提到的两种解决方法,并在可能的情况下尝试使用 OLEDB.12。
      • 是的,这很糟糕,但它仍然是从 Excel 书籍中获取数据的一种非常有用的方法。你只需要在这里和那里做一些小的改变来解决潜在的问题。由于您使用此方法访问的大多数数据都是更适合在数据库中的数据,因此我通常只是将所有我想使用此方法提取到一个小的 Access DB 中的数据聚合起来,然后发布任何 Excel 工作表, PDF等。
      • 该 URL 导致了重定向循环。试试https://support.microsoft.com/en-us/kb/319998
      【解决方案3】:

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

      Dim xlApp As New Excel.Application
      Dim xlWrkBk As Excel.WorkBook
      
      xlApp.WorkBooks.Open FILENAME
      Set xlWrkBk = xlApp.ActiveWorkbook
      

      然后从这里出发

      【讨论】:

      • 为什么你认为它是更好的解决方案?我不这么认为,因为有两件事:第一:打开文件比简单的 ADO 连接花费更多的时间,第二:我将无法使用 SQL 查询,这是我使用 ADO 的主要原因(除非我连接打开的文件,这几乎是相同的情况)......我发现的唯一积极因素是它应该(尚未测试)摆脱我现在拥有的“垃圾”引用,但对我来说打开时间增加不值得...
      • 为什么要存储可以运行 SQL 的数据库样式信息;在 Excel 文件中,为什么不使用 Access 或其他专门构建的数据库程序?我喜欢这种方法的唯一原因是,您可以逐步浏览工作表上的不同字段,最终更轻松地捕获任何可能的不良数据。
      • 那是因为我正在处理已经存在的用户的 Excel 文件。重建他们已经在使用的每个文件,只是将相同的数据放入 Access 中并不经济。而且 - 更重要的是 - 大多数用户不了解 Access 和 VBA,因此他们更喜欢使用他们知道的工具,他们可以使用这些工具自行修改或调整 - 这只是 Excel 文件。当然,在我可以从头开始设计应用程序的情况下,我也更喜欢使用数据库,但在大多数情况下,我会尝试“集成”不同的数据源,包括 .xls 文件,这会导致该问题......跨度>
      猜你喜欢
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多