Vba ADO记录集返回旧(过时)数据

Vba ADO记录集返回旧(过时)数据,vba,excel,recordset,Vba,Excel,Recordset,我编写了VBA代码,该代码使用ADODB记录集从Excel工作表检索数据,以填充用户表单。每次运行代码时,工作表都会替换为新数据 几周前,我开始遇到一个问题,recordset对象不会返回正确的数据,而是返回上一个会话中使用的数据。即使在关闭Excel文件并重新打开它之后,也会发生这种情况 例如,我将使用数据集A运行代码,然后关闭Excel文件。我重新打开Excel文件,用数据集B替换工作表,然后运行代码。它不会返回数据集B,而是返回数据集A。发生这种情况时,我已确认工作表实际上包含数据集B,而

我编写了VBA代码,该代码使用ADODB记录集从Excel工作表检索数据,以填充用户表单。每次运行代码时,工作表都会替换为新数据

几周前,我开始遇到一个问题,recordset对象不会返回正确的数据,而是返回上一个会话中使用的数据。即使在关闭Excel文件并重新打开它之后,也会发生这种情况

例如,我将使用数据集A运行代码,然后关闭Excel文件。我重新打开Excel文件,用数据集B替换工作表,然后运行代码。它不会返回数据集B,而是返回数据集A。发生这种情况时,我已确认工作表实际上包含数据集B,而不是A。 为了提供更多的背景信息,我相信这是在我从使用ACE连接字符串而不是JET切换时开始发生的。我被迫进行此转换,因为我开始在JET连接字符串中出错。我使用的连接字符串可以在下面找到

如果您能就此问题提供任何反馈,我将不胜感激。如果需要更多信息,请告诉我

strConnString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & mstrFile & ";Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1"""

此问题已解决(感谢Skippy)。将新数据导入工作表后保存文件解决了此问题。未保存文件时,连接指向包含过时数据的文件版本。

此问题已解决(感谢Skippy)。将新数据导入工作表后保存文件解决了此问题。未保存文件时,连接指向的文件版本包含过时数据。

几个问题。首先,这个VBA代码驻留在哪里?我假设它不在包含数据的同一个Excel文件中,在这种情况下,这并不重要。如果VBA代码位于不同的文件/应用程序中,则实际上不需要打开包含数据的Excel即可使代码正常工作。其次,您说您重新打开Excel,更改数据,然后再次运行代码-在重新运行代码之前,是否保存更改的Excel?VBA代码驻留在启用宏的Excel文件中,数据(在工作表中)也驻留在该文件中。在重新运行同一Excel文件中的code.VBA代码和数据之前,不会保存Excel文件?那么,为什么您需要一个连接字符串呢?但是,如果您使用的是连接字符串,则不保存文件可能会导致您的问题。编辑文件时,连接字符串将指向文件的原始未保存副本。在运行代码之前保存文件,并查看其是否有效。通过将其替换为
ThisWorkbook,消除
mstrFile
指向错误位置的可能性。全名
此外,连接字符串的结尾应该有一个分号:
IMEX=1”“;“
Skippy-导入数据后保存文件,这是有意义的。就连接字符串而言,我的理解是,即使它指向同一个文件,也必须使用连接字符串。有几个问题。首先,VBA代码驻留在哪里?我假设它不在包含获取数据,在这种情况下,这并不重要。如果VBA代码位于不同的文件/应用程序中,那么包含数据的Excel实际上不需要打开,代码才能工作。其次,您说您重新打开Excel,更改数据,然后再次运行代码-在重新运行代码之前,是否保存更改后的Excel?VB代码驻留在启用宏的Excel文件中,数据(在工作表中)也驻留在该文件中。在重新运行同一Excel文件中的code.VBA代码和数据之前,不会保存Excel文件。那么,为什么需要连接字符串?但是,如果使用的是连接字符串,则不保存该文件可能会导致问题。在编辑文件时,连接字符串将指向原始未保存的cop文件的y。在运行代码之前保存该文件,并查看是否有效。通过将其替换为
ThisWorkbook,消除
mstrFile
指向错误位置的可能性。FullName
此外,在连接字符串的末尾应该有一个分号:
IMEX=1”“
Skippy-导入数据后保存文件完成了此操作。这是有道理的。就连接字符串而言,我的理解是,您仍然必须使用连接字符串,即使它指向同一个文件。