IMEX=0的Excel ADODB查询未从第一行返回数据
我正在使用Excel VBA中的ADODB查询/更新另一个(关闭的)Excel电子表格中的命名范围。使用ADODB针对电子表格选择查询是简单的;然而,搞清楚更新查询是一件难事。在经历了很多很多之后。。。经过大量的研究和调整,我终于让更新生效了 但是,我发现SELECT查询不包括命名范围的第一行数据,即记录集包含19行,而命名范围有20行,记录集的第一行包含命名范围第二行的数据。命名区域没有标题行。。。一路上都是可靠的数据 我知道你在说什么,“哦,你需要将HDR属性设置为“否”。-)不,我试过了。见下文 我唯一的补充线索是,当IMEX设置为1或2时,SELECT查询将返回所有行。当IMEX设置为0时,则缺少第一行。但是,当IMEX设置为1或2时,记录集是只读的,因此无法更新。据我所知,使更新生效的唯一方法是将IMEX设置为0 关于清洁度,下面的代码是从一个更大的函数中摘录的 strSourcePath是目标工作簿的完整路径 strSourceRange是要更新的范围的名称 avNewValues()是一个二维数组,其中包含要写入的新值 我正在使用32位Office 2016和64位Windows 10IMEX=0的Excel ADODB查询未从第一行返回数据,excel,adodb,Excel,Adodb,我正在使用Excel VBA中的ADODB查询/更新另一个(关闭的)Excel电子表格中的命名范围。使用ADODB针对电子表格选择查询是简单的;然而,搞清楚更新查询是一件难事。在经历了很多很多之后。。。经过大量的研究和调整,我终于让更新生效了 但是,我发现SELECT查询不包括命名范围的第一行数据,即记录集包含19行,而命名范围有20行,记录集的第一行包含命名范围第二行的数据。命名区域没有标题行。。。一路上都是可靠的数据 我知道你在说什么,“哦,你需要将HDR属性设置为“否”。-)不,我试过了。
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strconnect As String
Dim strSQL As String
Dim iRow As Integer, iCol As Integer
strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strSourcePath & ";" & _
"Extended Properties=""Excel 12.0;HDR=No;IMEX=0"";"
strSQL = "SELECT * FROM " & strSourceRange & ";"
Set conn = CreateObject("adodb.connection")
conn.Open strconnect
Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, conn, adOpenStatic, adLockOptimistic
'Update the values in the recordset
rs.MoveFirst
For iRow = 1 To UBound(avNewValues, 1)
For iCol = 1 To UBound(avNewValues, 2)
rs.Fields(iCol - 1).Value = avNewValues(iRow, iCol)
Next
rs.MoveNext
Next
rs.Update
请为XLSX文件尝试以下连接字符串(注意下面字符串中的关键字Xml): 对于XLSM文件,也可以使用此选项(请注意下面字符串中的关键字Macro):
另外,请尝试设置IMEX=1。我遇到了一个类似的问题,这两个参数的组合解决了这个问题。以下是我发现的。如果您根本不指定IMEX属性,那么它就可以工作,即返回所有行,并读取/写入记录集。这让人感到困惑,因为我能找到的所有文档都说连接是objects假定默认IMEX值为零。如果为真,则显式指定默认值会更改连接对象的行为
在我发现这一点之前,我已经决定只考虑不良行为并在数据范围中添加一个标题行。但现在我将完全跳过IMEX属性,除了默认值。这无疑会带来一些数据类型不匹配的风险,但当前项目的风险很低。忘了提及,我也没有提到ried IMEX=0,FirstRowHasNames=FALSE;这仍然跳过第一行。我厌倦了IMEX=1,ReadOnly=FALSE;这仍然返回一个只读的记录集(至少错误消息说它是只读的)您正在尝试更新Excel工作表吗?暂时忘记第一行的问题。更新永远不会起作用,此功能有限制。您走错了路,我建议您在临时工作表上复制记录集,进行必要的修改,等等…抱歉,我误解了,更新可能会我正在为另一个Excel工作簿工作,但不在同一个工作簿中。请忽略我上面的评论。谢谢,@M.R。事实上,它确实有效。而且速度非常快,无需打开目标工作簿。使用CopyFromRecordset需要打开(大)目标工作簿…这意味着与ADODB SQL查询相比,内存消耗和CPU周期要多得多。此外,使用SQL处理逻辑的能力(与构建VBA以确定哪些行/列应得到更新相反)在我看来是一个很大的值…很大!唯一的问题是我还没有弄清楚如何正确地获取SELECT查询。哦…@M.R…。我们同时发布了。:-)是的,target在不同的工作簿中。谢谢,@M.R。很好的建议。我刚刚尝试了这些,但都得到了与以前相同的结果,即记录集可以更新,但是缺少第一行数据。当我更改为IMEX=1时,第一行数据返回,但记录集是只读的。IMEX=2有什么区别吗?遗憾的是,没有,@M.R.IMEX=2的行为与IMEX=1相同,即,我获取第一行数据,但记录集处于只读状态。如果不指定IMEX属性,请获取此信息总之,它是有效的,也就是说,返回所有行,记录集是读/写的。见图。在我意识到这一点之前,我已经决定,我只需适应不良行为,并向数据范围添加一个标题行。但现在我只需跳过IMEX属性。这无疑会带来一些数据类型不匹配的风险,但风险很低r当前项目。
strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strSourcePath & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=0"";"
strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strSourcePath & ";" & _
"Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=0"";"