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

 

posted @ 2023-08-03 18:47  一曲轻扬  阅读(1112)  评论(0)    收藏  举报