如何将SQL语句结果导出到Excel文件

我有一个Access数据库和Excel VBA中的表单。 我input到数据库的所有数据都是通过VBA表格input的。

这个数据库包含了我们今年在公司里收到的所有好处。 但是同一个员工可以要求两次或两次以上的卡,所以我们在他的DB上会有一个以上的logging。

我需要的是当logging数大于1时,SQL语句结果应该出现在Excel报告中。

我使用SELECT (*) COUNT语句来知道何时有多个logging与search条件兼容。 但是我不能让结果出现在Excel文件中。

这是我的代码:

 Public Function Relatorio() Dim sql As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim rel As String Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & enderecoDB & ";Jet OLEDB:Database" cn.Open Set rs = New ADODB.Recordset sql = "INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" & enderecoDB & ";', 'SELECT * FROM [Planilha1$]') SELECT * FROM controle WHERE BP = " & controlectform.nmbpbox.Value & ";" rs.Open sql, cn End Function 

当我运行这个代码时,它给了我一个消息:

找不到OPENROWSET表退出

我不能安装新的程序,所以我只需要使用Excel VBA和Access DB来完成。

我怎样才能做这个工作?

我不相信Access支持OPENROWSET,你正在使用的dynamic表。 我有很多这样做的旧项目,所以这里是我的方法

 Public Function Relatorio() Dim sql As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim rel As String Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & enderecoDB & ";Jet OLEDB:Database" cn.Open Set rs = New ADODB.Recordset dim path_To_XLSX dim name_of_sheet path_To_XLSX = "c:\temp\output.xlsx" name_of_sheet = "Planilha1" sql = sql = "SELECT * INTO [Excel 12.0;Database=" & path_To_XLSX & "]." & name_of_sheet & " FROM controle WHERE BP = '" & controlectform.nmbpbox.Value & "';" rs.Open sql, cn 'If this application is in an unsecure environment, use the following code instead! This is to prevent a SQL injection, security concern here. 'As it is an Access Database, this is likely overkill for this project 'Create Command Object. Set Cmd1 = New ADODB.Command Cmd1.ActiveConnection = cn cmd1.CommandText = "SELECT * FROM controle INTO [Excel 12.0;Database=" & path_To_XLSX & "]." & name_of_sheet & " WHERE BP = ?" ' Create Parameter Object. Set Param1 = Cmd1.CreateParameter(, adInteger, adParamInput, 5) 'use adVarchar for strings(versus adInteger), https://www.w3schools.com/asp/met_comm_createparameter.asp Param1.Value = controlectform.nmbpbox.Value Cmd1.Parameters.Append Param1 Set Param1 = Nothing Set Rs = Cmd1.Execute() End Function 

这么多年前我有过这个挑战,我不记得,但是这个链接响了。 检查是否有帮助。

https://stackoverflow.com/a/28889774/382588

尝试{connw.Open(); OleDbCommand命令; 命令=新的OleDbCommand(“更新交付”+“SET Deliveries.EmployeeID =?,Deliveries.FIN =?,Deliveries.TodaysOrders =?,connw); command.Parameters.Add(新的OleDbParameter(”@ EMPID“,Convert.ToDecimal (empsplitIt [1]))); command.Parameters.Add(new OleDbParameter(“@ FIN”,truckSplit [1] .ToString())); command.Parameters.Add(new OleDbParameter(“@ TodaysOrder”,“R “)); catchReturnedRows = command.ExecuteNonQuery(); / /提交connw.Close();} catch(OleDbExceptionexception){MessageBox.Show(exception.Message,”OleDbexception“);}

你可以使用这个来打印实际的SQL。

 Private Sub Command2_Click() Dim db As Database Dim qr As QueryDef Set db = CurrentDb For Each qr In db.QueryDefs TextOut (qr.Name) TextOut (qr.SQL) TextOut (String(100, "-")) Next End Sub Public Sub TextOut(OutputString As String) Dim fh As Long fh = FreeFile Open "C:\Users\rs17746\Desktop\Text_Files\sample.txt" For Append As fh Print #fh, OutputString Close fh End Sub 

这是另一个版本给你。 这将导出每个查询的结果,每个到一个单独的文本文件。

 Private Sub Command0_Click() Dim qdf As QueryDef Dim strFileName As String For Each qdf In CurrentDb.QueryDefs If Left(qdf.Name, 1) <> "~" Then 'you need to figure out TransferText command. Maybe 'you won't be lazy and expect people to read it to 'you and tutor you on how it works. strFileName = qdf.Name 'Docmd.TransferText .... DoCmd.TransferText transferType:=acExportDelim, TableName:=strFileName, FileName:="C:\test\" & strFileName & ".txt", hasfieldnames:=True End If Next qdf MsgBox "Done" End Sub