IMEX = 0的Excel ADODB查询不返回第一行

时间:2018-05-01 15:02:45

标签: excel adodb

我在Excel VBA中使用ADODB来查询/更新另一个(已关闭的)Excel电子表格中的命名范围。使用ADODB对电子表格进行SELECT查询很简单;然而,弄清楚UPDATE查询是一个熊。经过多次,大量的研究和调整,我终于得到了UPDATE的工作。

但是,我发现SELECT查询不包含来自命名范围的第一行数据,即记录集包含19行,而命名范围包含20行,记录集的第一行包含第二行数据命名范围的一行。命名范围没有标题行...它一直是可靠的数据。

我知道你在说什么,“哦,你需要将HDR属性设置为”No“。:-)不,我试过了。见下文。

我唯一的另一个线索是,当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

2 个答案:

答案 0 :(得分:0)

请为XLSX文件尝试以下连接字符串(请注意下面字符串中的关键字 Xml ):

 strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & strSourcePath & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=0"";"

或此一个XLSM文件(请注意下面字符串中的关键字):

 strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & strSourcePath & ";" & _
        "Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=0"";"

另外,请尝试设置 IMEX = 1 。我有一个类似的问题,这个参数组合解决了它。

答案 1 :(得分:0)

这是我发现的。如果你根本没有指定IMEX属性,那么它就可以工作,即返回所有行并且记录集是读/写的。这很令人困惑,因为我能找到的所有文档都说连接对象假定默认IMEX值为零。如果这是真的,那么显式指定默认值会更改连接对象的行为。

在我发现这个之前,我已经决定只调整不良行为并在数据范围中添加标题行。但现在我将完全跳过IMEX属性,除了默认值。这无疑会引入数据类型不匹配的风险,但当前项目的风险很低。