Access 谈谈数据导出语句 DoCmd.OutputTo
官方文档:DoCmd.OutputTo 方法 (Access) | Microsoft Learn
看上去挺复杂的,其实主要看第一和第三个参数.不想去研究的朋友,下面这几行代码,应该够用了
'将报表导出为PDF代码 DoCmd.OutputTo acOutputReport, "报表名称", acFormatPDF, , True '将报表导出为Excel代码 DoCmd.OutputTo acOutputForm, "目标名称", acFormatXLS, , True '将窗体导出为PDF代码 DoCmd.OutputTo acOutputForm, "目标名称", acFormatPDF, , True '将窗体导出为Excel代码 DoCmd.OutputTo acOutputForm, "目标名称", acFormatXLS, , True
2023-8-12补充:
上面的代码适合全表输出,对于有筛选需求的环境,请使用下面这种方式:
这是我封装好的公共函数,放到模块里就可以用:
Function ToEXCEL(ByVal sql As String) As Boolean On Error Resume Next Dim FMName As String FMName = Screen.ActiveForm.Name & Format(Now(), "_YYYYMMDD") '取窗体名+时间为查询名,也将是导出的EXCEL的文件名 CurrentDb.CreateQueryDef FMName, sql '创建查询 DoCmd.OutputTo acOutputQuery, FMName, acFormatXLS, , True '输出 CurrentDb.QueryDefs.Delete FMName '删除查询 On Error GoTo 0 End Function
调用的时候需要判断一下用户是否有对表进行筛选操作,比如:
Private Sub Command350_Click() '导出Excel Dim filStr, sql As String sql = "select * FROM FQ销售单管控" filStr = Me.FM物料进出明细.Form.Filter '取数据表的筛选条件 If filStr <> "" Then sql = sql & " where " & filStr '如果有筛选,就要加上筛选条件,注意要加 where ToEXCEL sql End Sub
2023-8-16日 补充:
接上面的例子,在后面的使用中,同事给我反应了一个问题,就是在数据表中,有些字段他不想导出来,于是就把部分字段隐藏起来了.结果发现没用,EXCEL上还是全部给导出来了.
我知道问题在上面的SQL语句里面,所以我改善了一下,新增了一个获取可见字段的函数:
Public Function GetVisibleFields(ByVal 窗体路径 As Form) As String '获取数据表中可见字段的所有名称,并以"字段1,字段2.."的形式返回.参数格式如:Forms("frmMain").Controls("A").Form Dim ctl As control Dim visibleFields As String If 窗体路径 Is Nothing Then Exit Function For Each ctl In 窗体路径.Controls If ctl.ControlType = acTextBox Or ctl.ControlType = acCheckBox Then If ctl.ColumnHidden <> -1 Then visibleFields = visibleFields & ctl.Name & "," End If Next ctl If Len(visibleFields) > 0 Then '去掉最后一个逗号 visibleFields = Left(visibleFields, Len(visibleFields) - 1) End If GetVisibleFields = visibleFields End Function
调用时,这么调用:
Private Sub Command255_Click() '导出EXCEL Dim FilStr, isql As String FilStr = Me.FM订单管理.Form.Filter isql = "select " & GetVisibleFields(Me.FM订单管理.Form) & " From FQ订单管理" If FilStr <> "" Then isql = isql & " where " & FilStr ToEXCEL isql End Sub
感谢马小要老师的技术支持. VBA中的条件语句,最好确定是这种类型之后,再去用它的属性.比如上面的
If ctl.ControlType = acTextBox Or ctl.ControlType = acCheckBox Then If ctl.ColumnHidden <> -1 Then visibleFields = visibleFields & ctl.Name & "," End If
你就不能写成下面这样子,后面的条件 ctl.ColumnHidden <> -1 还是会被编译的.当编译器发现 ctl 对象没有ColumnHidden 这个属性时,它就会报错.
If (ctl.ControlType = acTextBox Or ctl.ControlType = acCheckBox) AND ctl.ColumnHidden <> -1 Then
visibleFields = visibleFields & ctl.Name & "," End If