【发布时间】:2010-01-08 22:26:17
【问题描述】:
我正在使用 Microsoft OLE DB Provider for Jet 使用 VBA 对 Excel 中的电子表格执行查询。有没有办法在未保存工作簿上执行以下代码?
例如,如果从未保存过工作簿,ActiveWorkbook.FullName 将返回“Book1”。在这种情况下,数据源将假定路径是活动目录,并且由于文件从未保存过而出错。
有什么方法可以使用 Excel 临时文件作为 Jet 的数据源?我想对此进行测试,但我什至不知道如何返回 Excel 临时文件的路径和名称。
Public Sub LocalJetQuery()
Dim objStartingRange As Range
Dim objConnection As New ADODB.Connection
Dim objRecordset As New ADODB.Recordset
Dim strDSN As String
Dim strSQL As String
Set objStartingRange = Application.Selection
If CLng(Application.Version) >= 12 Then
strDSN = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & objStartingRange.Worksheet.Parent.FullName & ";" _
& "Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1"";"
Else
strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & objStartingRange.Worksheet.Parent.FullName & ";" _
& "Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
End If
strSQL = "SELECT * FROM [" & objStartingRange.Worksheet.Name & "$];"
objConnection.Open strDSN
objRecordset.Open strSQL, objConnection
Application.Workbooks.Add(xlWBATWorksheet).Sheets(1).Cells(1, 1).CopyFromRecordset objRecordset
End Sub
谢谢!
【问题讨论】:
-
你从哪里运行这个? Excel 本身?如果是这样,您可以通过自动化 Excel 本身(即在 VBA 代码中)来完成您需要的操作。我是 Access 开发人员,因此无法告诉您它是如何完成的,但是通过 VBA,您可以处理处于加载到 Excel 实例中的状态的数据,无论它是否已保存到磁盘。
-
是的,在 Excel 中。我想对电子表格中的数据运行 SQL 查询,但我不想事先保存工作簿。
-
我看不到任何方法可以对未保存的数据运行 SQL 查询。这并不意味着您不能查看数据并使用 Excel 的功能来完成很多相同的事情。您是否考虑过自动化过滤功能?您也许可以通过这种方式进行简单的过滤并检查总字段。但是将电子表格(或将其副本保存为临时文件以进行查询!)会简单得多。
-
我没想过自动化过滤功能。我会调查的。我还发现 Jet 没有与 Excel 电子表格相同的限制,这会带来其他问题。在 Excel 中工作时,留在 Excel 功能中更简单,但我会留下这个问题。也许有人会想出一个解决办法。谢谢大卫!
-
您可以将新工作簿保存为临时文件,然后在完成后删除 excel 文件吗?您的代码看起来只是制作一个新工作簿并将您的查询转储到该新工作簿中。如果您不打算保存查询,您可以将查询转储到当前工作簿中的新页面吗?然后进行其他操作,然后删除该临时表。不太确定你想要完成什么......