ExcelADO。表名。运行时错误'-2147217865(80040e37)'。 Acc2013x64

时间:2014-01-09 06:14:47

标签: sql excel excel-vba vba

我已成功使用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。

1 个答案:

答案 0 :(得分:0)

来自utteraccess的Norie让我走上了正确的道路:

  

在Excel中ListObjects不是命名范围,你拥有的是a   ListObject所以它不会出现在架构中。

所以这与对象模型的变化无关; listobjects和命名范围只是不同的对象,即使它们对用户看起来几乎相同。

没有找到通过ExcelAdo处理ListObjects的答案,但由于这是另一个问题,我将其留在这里:ExcelADO: Fill recordset with ListObject