我在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
答案 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属性,除了默认值。这无疑会引入数据类型不匹配的风险,但当前项目的风险很低。