我已成功使用ExcelADO在长时间阅读整个SpreadSheet时读取Excel数据并将其导入MSAccess。
这次我需要导入一些可以与同一电子表格中的其他表对象共存的表对象。
根据文档http://support.microsoft.com/kb/278973,唯一需要更改的是SQL字符串中的From子句:
oRS.Open "Select * from Table1", oConn, adOpenStatic
然而,这会失败并显示此主题标题中提到的错误号,该错误号基本上表示该电子表格中不存在对象Table1。
我正在使用的完整代码是:
Private Sub Command0_Click()
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim dbs As DAO.Database
Set dbs = CurrentDb
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\MyPath\MyFile.xlsx;" & _
"Extended Properties= 'Excel 12.0;HDR=Yes';"
rst.Open "Select * From Table1", _
cnn, adOpenStatic, adLockOptimistic, adCmdText
With rst
If Not .EOF And Not .BOF Then
Do Until .EOF
Debug.Print .Fields(0), .Fields(1), .Fields(2)
.MoveNext
Loop
End If
End With
Set rst = Nothing
Set cnn = Nothing
Set dbs = Nothing
End Sub
正如我所说,我可以使用以下方法检索电子表格的全部内容:
.Open "Select * From [Sheet1$]", oConn, adOpenStatic
我也可以获取指定范围的内容:
.Open "Select * From [Sheet1$A1:B10]", oConn, adOpenStatic
我使用VBA仔细检查了该对象是否存在,它就在那里:
Private Sub Command2_Click()
Dim xlAp As Excel.Application
Dim xlWb As Excel.Workbook
Dim i As Long
Set xlAp = New Excel.Application
Set xlWb = xlAp.Workbooks.Open("C:\MyPath\MyFile.xlsx")
For i = 1 To xlWb.ActiveSheet.ListObjects.Count
Debug.Print xlWb.ActiveSheet.ListObjects(i).Name, _
xlWb.ActiveSheet.ListObjects(i).DisplayName
Next i
Set xlWb = Nothing
Set xlAp = Nothing
End Sub
有人知道如何解决这个问题吗?
提前致谢,
迭
编辑:
嗯,错误是正确的,因为我的对象Table1不存在于使用以下方式评估的模式中:
Set rs = cnn.OpenSchema(adSchemaTables)
With rs
If Not .EOF And Not .BOF Then
Do Until .EOF
Debug.Print rs.Fields(0), _
rs.Fields(1), _
rs.Fields(2), _
rs.Fields(3)
.MoveNext
Loop
End If
End With
Set rs = Nothing
也不在表目录中:
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Set cat = New ADOX.Catalog
cat.ActiveConnection = cnn
For Each tbl In cat.Tables
Debug.Print tbl.Name, tbl.Type
Next tbl
Set cat = Nothing
考虑到documentation明确说:
,这很奇怪命名范围被视为“表”,工作表被视为“系统表”,
所以我的猜测是,Excel 2013 x64以不同于以前的方式存储命名区域,并且通过ExcelADO访问它们,语法需要在最佳方案中进行修改,否则它们将无法以这种方式访问。
正如我之前所说,命名范围存在于我的电子表格中,我可以通过自动化使用范围对象循环遍历它们。
希望有人能回答这个问题。
一切顺利,
迭
Environ:Windows 7 x64,Access 2013 x64,Excel 2013 x64。
答案 0 :(得分:0)
来自utteraccess的Norie让我走上了正确的道路:
在Excel中ListObjects不是命名范围,你拥有的是a ListObject所以它不会出现在架构中。
所以这与对象模型的变化无关; listobjects和命名范围只是不同的对象,即使它们对用户看起来几乎相同。
没有找到通过ExcelAdo处理ListObjects的答案,但由于这是另一个问题,我将其留在这里:ExcelADO: Fill recordset with ListObject