使用vba将参数化查询导出为ex​​cel

我想通过单击表单中的一个button将我的查询结果导出到Excel文件。

为此,我使用这个代码,它运作良好:

Private Sub Command9_Click() On Error GoTo ProcError DoCmd.OutputTo _ ObjectType:=acOutputQuery, _ ObjectName:="Contract Type Billing", _ OutputFormat:=acFormatXLSX, _ Autostart:=True ExitProc: Exit Sub ProcError: Select Case Err.Number Case 2501 'User clicked on Cancel Case Else MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _ "Error in cmdExportQuery_Click event procedure..." End Select Resume ExitProc End Sub 

但我的查询使用2个参数sdateedate ,我不想问我这些值,但我希望用户input他们的forms与适当的文本框。

所以我在DoCMD.OutputTo之前添加了这一点

 Dim qdf As DAO.QueryDef Set qdf = CurrentDb.QueryDefs("Contract Type Billing") qdf.Parameters("sdate") = sdate.Value qdf.Parameters("edate") = edate.Value 

但不幸的是,它不工作。 在导出之前,如何将参数放入我的查询中?

如果要保持原始参数查询不变,则可以创build临时QueryDef以将数据转储到临时表中,然后将临时表输出到Excel:

 Dim cdb As DAO.Database, qdf As DAO.QueryDef Const tempTableName = "_tempTbl" Set cdb = CurrentDb On Error Resume Next DoCmd.DeleteObject acTable, tempTableName On Error GoTo 0 Set qdf = cdb.CreateQueryDef("") qdf.SQL = "SELECT * INTO [" & tempTableName & "] FROM [Contract Type Billing]" qdf.Parameters("sdate").Value = DateSerial(2013, 1, 3) ' test data qdf.Parameters("edate").Value = DateSerial(2013, 1, 5) qdf.Execute Set qdf = Nothing Set cdb = Nothing DoCmd.OutputTo acOutputTable, tempTableName, acFormatXLSX, "C:\__tmp\foo.xlsx", True 

我碰到相同的问题,而不是使用参数,我宁愿插入WHERE标准的SQL脚本,并直接导出到Excel中的查询结果(当然,你将不得不定义一个目标文件)。 假定合同types结算中的date字段命名为dDate。

 Set qdf = CurrentDb.CreateQueryDef("qTempQuery") qdf.SQL = "SELECT * FROM [Contract Type Billing] WHERE ((([Contract Type Billing].dDate)>#" _ & cdate(sdate.value) & "# And ([Contract Type Billing].dDate)<#" & cdate(edate.value) & "#));" DoCmd.OutputTo acOutputQuery, "qTempQuery", "ExcelWorkbook(*.xlsx)", OutputFileName, False DoCmd.DeleteObject acQuery, "qTempQuery" Set qdf = Nothing 

一种方法是:假设表单名称是[MyForm],并且文本框仍然是[sdate]和[edate],然后删除PARAMETERS部分(如果存在于您的查询中)。 在查询中将[sdate]和[edate]replace为eval(“Forms![MyForm]![sdate]”)和eval(“Forms![MyForm]![edate]”)

另一种方法是在模块中创build公共职能:

 Global m_sdate as date Global m_edate as date Public Function sdate() as date sdate = m_sdate end function Public Function edate() as date edate = m_edate end function 

将查询中的[sdate]和[edate]replace为调用sdate()和edate()。 并在出口前添加分配:

 m_sdate = Me.sdate.Value m_edate = Me.edate.Value DoCmd.OutputTo ............