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

如何将SQL语句结果导出到Excel文件,sql,excel,vba,ms-access,Sql,Excel,Vba,Ms Access,我有一个Access数据库和一个Excel VBA表格。我输入数据库的所有数据都是通过VBA表单输入的 该数据库包含我们今年在公司已经收到的所有福利卡。但同一名员工可以索要两次或更多的卡,因此我们会在DB上为他保留多条记录 我需要的是,当记录数大于1时,SQL语句结果应显示在Excel报告中 我使用SELECT*COUNT语句来知道何时有多条记录与搜索条件兼容。但我无法将结果显示在Excel文件中 这是我的密码: Public Function Relatorio() Dim sql A

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

该数据库包含我们今年在公司已经收到的所有福利卡。但同一名员工可以索要两次或更多的卡,因此我们会在DB上为他保留多条记录

我需要的是,当记录数大于1时,SQL语句结果应显示在Excel报告中

我使用SELECT*COUNT语句来知道何时有多条记录与搜索条件兼容。但我无法将结果显示在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动态表。我有很多老项目都是这样做的,所以这里是我的方法

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

很多年前我就有过这样的挑战,我都记不起来了,但是这个链接响了。检查它是否有用


请尝试{connw.Open;OleDbCommand命令;command=new OleDbCommand Update Deliveries+设置Deliveries.EmployeeID=?,Deliveries.FIN=?,Deliveries.TodaysOrders=?,connw;command.Parameters.AddnewOleDbParameter@EMPID,Convert.ToDecimalempsplitIt[1];command.Parameters.AddnewOleDbParameter@FIN,卡车碎片[1].ToString;command.Parameters.AddnewOleDbParameter@TodaysOrder,R;catchReturnedRows=command.ExecuteNonQuery;//Commit connw.Close;}catch-OleDbException异常{MessageBox.Showexception.Message,OleDb异常;}

您可以使用它来打印实际的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

尝试将此查询作为视图放入access中,然后从vbaI中查询新视图,并使用表单中的字段进行选择。即使我将查询置于access中,我是否可以继续使用表单字段进行选择?您的回答对我帮助很大。Excel无法接受sql语句。在FROM子句上给我一个错误。我在网上搜索,发现它是另一个与代码配合良好的sql语句。sql=选择*进入[Excel 12.0;数据库=&path\u To\u XLSX&]。&表格的名称,来自控件,其中BP='&controllectform.nmbpbox.Value&';非常感谢。我已经试过两次了。将使用您的修复编辑我的答案。很高兴这有帮助!这无疑是在C中进行参数化查询的一种好方法,但在本例中,他使用的是Access,它使用VBA VB6 era,而不是VB.NET。实际上,我正准备为一个VB.NET应用程序编写一个查询,不带花括号。当然,我相信命令字符串是最棘手的部分。。。如果我是对的,我不确定。。。使用带有命令功能的c oledb并嵌入此查询可能会。。。这就是我想尝试的