IMEX=0的Excel ADODB查询未从第一行返回数据

IMEX=0的Excel ADODB查询未从第一行返回数据,excel,adodb,Excel,Adodb,我正在使用Excel VBA中的ADODB查询/更新另一个(关闭的)Excel电子表格中的命名范围。使用ADODB针对电子表格选择查询是简单的;然而,搞清楚更新查询是一件难事。在经历了很多很多之后。。。经过大量的研究和调整,我终于让更新生效了 但是,我发现SELECT查询不包括命名范围的第一行数据,即记录集包含19行,而命名范围有20行,记录集的第一行包含命名范围第二行的数据。命名区域没有标题行。。。一路上都是可靠的数据 我知道你在说什么,“哦,你需要将HDR属性设置为“否”。-)不,我试过了。

我正在使用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 10

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"";"