【发布时间】: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