【问题标题】:Run Time Error: External table is not in the expected format运行时错误:外部表不是预期的格式
【发布时间】:2020-06-29 16:27:26
【问题描述】:

我正在尝试从共享驱动器中提取数据而不打开文件。
我使用了 ADO,因此我可以轻松地操作生成的表格,因为我只需要特定的字段。
ADO 比执行过滤和复制例程更可取,因为我可以使用 sql 查询 来获得我想要的。

线路:rec.Open sqlStr, con, adOpenStatic, adLockReadOnly

抛出错误

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

该文件为 .xls 格式,并包含在 信任中心 被阻止文件(将在受保护视图中打开的文件)的默认设置中。 p>

出于好奇,我暂时禁用了文件阻塞,但发生了同样的错误。

当我打开文件并运行代码时,它会检索数据。

如何在不打开文件的情况下完成这项工作?

我使用的代码:

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

编辑1:

我也试过这个:

    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 有关。

【问题讨论】:

  • "Extended Properties=""Excel 12.0 Xml;HDR=YES""in 您的连接字符串指的是 Excel 2007 及更高版本的 xlsx XML 格式。尝试"Extended Properties=""Excel 8.0;HDR=YES"" 获取 xls 文件。
  • @AxelRichter 哦,忘了说,我试过了。同样的错误。另外,我认为设置连接但打开Recordset没有问题。
  • 嗯,但错误说明了这一点:不是预期的格式。文件的真正格式是什么?真的是 Excel 97-2003 xls?它是如何创建的?
  • @AxelRichter 是的,这就是格式。 I 是机器生成的文件,是检查结果。我正在研究一个可以总结机器输出的模板。所以我需要从保存在共享驱动器中的机器生成文件中获取某些数据字段。我可以手动打开这些文件,正如我所提到的,如果文件已打开,则代码执行时不会出错。
  • 我怀疑生成这个的机器做错了什么。尝试在 Excel 中打开文件,以 Excel 97-2003 xls 格式使用不同的文件名保存。将其放在共享驱动器上,然后尝试使用此文件。如果它有效,那么我的怀疑是正确的。顺便说一句:它适用于打开的文件并没有什么可说的。如果您在 Excel 中打开了 test.csv 文件,那么您甚至可以使用 ADO 和 Excel 驱动程序访问它。

标签: excel vba excel-2010 ado


【解决方案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 并重试。现在它会成功。

在您的情况下,它失败得这么晚,表明错误还不足以阻止连接。

问候

阿克塞尔

【讨论】:

    【解决方案2】:

    我知道这是一篇旧帖子,但对于目前遇到此问题的人来说,这似乎是随机的,我发现它可能仍然与您的连接字符串有关,不包括 IMEX=1

    例如:con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filepath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"

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

    可以在以下位置找到有用的连接字符串来源:https://www.connectionstrings.com/excel/

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2010-11-11
        相关资源
        最近更新 更多