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

时间:2013-11-08 10:40:13

标签: sql excel vba ms-access

我想通过单击表单中的按钮将查询结果导出到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

但是我的查询使用了两个参数 sdate edate ,我不希望访问权限要求我提供这些值,但我希望用户在表单中输入它们使用适当的文本框。

所以我在DoCMD.OutputTo

之前将这一位添加到代码中
Dim qdf As DAO.QueryDef

Set qdf = CurrentDb.QueryDefs("Contract Type Billing")

qdf.Parameters("sdate") = sdate.Value
qdf.Parameters("edate") = edate.Value

但遗憾的是它不起作用。在导出之前如何将参数放入我的查询中?

3 个答案:

答案 0 :(得分:3)

如果要保持原始参数查询不变,可以创建一个临时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

答案 1 :(得分:1)

我遇到了同样的问题而不是使用参数我宁愿在sql脚本中插入WHERE标准并直接将查询结果导出到excel中(当然你必须定义一个目标文件)。假设合同类型开票中的日期字段名为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

答案 2 :(得分:0)

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

另一种方法是在模块中创建公共函数:

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]替换为调用sdate()和edate()。 并在导出前添加分配:

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

DoCmd.OutputTo ............