运行时错误:外部表不是预期的格式

时间:2014-08-18 05:27:37

标签: vba excel-vba excel-2010 ado excel

我试图从 共享驱动器 中提取数据而不打开文件。
为此,我使用了 ADO ,以便我可以轻松操作结果表,因为我只需要特定的字段。
ADO 是优选的,因为我可以使用 sql query 来获得我想要的东西,而不是进行过滤和复制例程。
不幸的是,我在下面的行中遇到了麻烦:

rec.Open sqlStr, con, adOpenStatic, adLockReadOnly

抛出错误

enter image description here

该文件采用 .xls 格式,并包含在信任中心默认设置的被阻止文件中(将在受保护的视图中打开的文件)。 /> 因此,出于好奇,我暂时禁用了文件阻止,但发生了同样的错误 当我打开文件并运行代码时,奇怪的是,它会检索我想要的数据
有关如何在不打开文件的情况下完成此工作的任何想法?

我目前使用的代码:

Sub stancial()
    Dim sPath As String, fName As String

    sPath = "P:\Folder\": fName = "Report.xls"

    Dim con As ADODB.Connection: Set con = New ADODB.Connection
    Dim rec As ADODB.Recordset: Set rec = New ADODB.Recordset

    Dim DataSource As String
    DataSource = sPath & fName

    con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & DataSource & ";" & _
            "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

    Dim cat As ADOX.Catalog: Set cat = New ADOX.Catalog
    Set cat.ActiveConnection = con

    Dim shName As String
    shName = Replace(cat.Tables(0).Name, "'", "")

    Dim sqlStr As String
    sqlStr = "SELECT * FROM [" & shName & "];"

    rec.Open sqlStr, con, adOpenStatic, adLockReadOnly
    Sheet1.Range("A2").CopyFromRecordset rec

    rec.Close
    con.Close
    Set cat = Nothing
    Set rec = Nothing
    Set con = Nothing
End Sub

EDIT1:

是的,正如我所评论的那样,我也试过这个:

    con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & DataSource & ";" & _
            "Extended Properties=""Excel 8.0;HDR=YES"";"

还有这个:

    con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & DataSource & ";" & _
            "Extended Properties=""Excel 8.0;HDR=YES"";"

但它仍然会出错。我认为与打开 Recordset 而不是 Connection 有关。

3 个答案:

答案 0 :(得分:1)

如果这是一台机器生成的XLS文件,我怀疑生成这个的机器做错了什么。尝试在Excel中打开文件,使用Excel 97-2003 xls格式的不同文件名保存。将它放在共享驱动器上,然后尝试使用此文件。如果它有效,我的嫌疑人是正确的。

顺便说一句:它适用于打开的文件并没有什么可说的。如果您在Excel中打开了test.csv文件,那么您甚至可以使用ADO和Excel驱动程序访问它。

如果您尝试,可以查看此内容:

con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & "C:\path\test.csv" & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

如果test.csv未在Excel中打开,则会失败。现在在Excel中打开test.csv并再试一次。现在它会成功。

在你的情况下,它失败得太晚,表明错误不足以阻止连接。

问候

阿克塞尔

答案 1 :(得分:0)

我知道这是一篇过时的文章,但是对于目前有此问题的任何人来说,似乎是随机的,我发现这可能仍然与您的连接字符串有关,但不包括public elementEvent($event) { this.isValid = $event.status; this.ref.detectChanges(); }

示例:IMEX=1

  

始终使用IMEX = 1是检索混合数据列数据的一种更安全的方法。考虑以下情况:一个Excel文件可能会正常工作,原因是该文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型。这可能会导致您的应用崩溃。

有关连接字符串的有用信息,请参见:https://www.connectionstrings.com/excel/

答案 2 :(得分:0)

在使用adodb读取特定的.xlsx文件时,我曾经遇到错误。我将格式更改为.xls,之后错误消失了。很好,但是过了一会儿,在另一台计算机上,再次尝试读取另一个文件时,问题再次出现。 我发现的问题是,包含列标题的第一行具有垂直和水平中心对齐。将对齐方式恢复为默认值后,错误停止了。