Vba 根据子窗体中的选项保存报告

Vba 根据子窗体中的选项保存报告,vba,ms-access,ms-access-forms,Vba,Ms Access,Ms Access Forms,我有一个名为(frmcarSearch)的主窗体,它显示名为(tblCar)的表数据 该表单包含三个下拉菜单(cmbCar,cmbType,cmbGroup),允许用户筛选数据并将其显示在名为(frmCarSub)的子表单中 有三个按钮用于保存过滤后的数据btnpint,btnPDF,btnExcel 问题是:如何为每个按钮编写代码,以便报表根据每个下拉菜单中的选项在子窗体中显示(或保存)数据 每个组合框的代码: Private Sub-cmbCar\u AfterUpdate() Me.cm

我有一个名为(
frmcarSearch
)的主窗体,它显示名为(
tblCar
)的表数据

该表单包含三个下拉菜单(
cmbCar
cmbType
cmbGroup
),允许用户筛选数据并将其显示在名为(
frmCarSub
)的子表单中 有三个按钮用于保存过滤后的数据
btnpint
btnPDF
btnExcel

问题是:如何为每个按钮编写代码,以便报表根据每个下拉菜单中的选项在子窗体中显示(或保存)数据


每个组合框的代码:

Private Sub-cmbCar\u AfterUpdate()
Me.cmbGroup.Value=“”
Me.cmbType.Value=“”
Me.frmCarSub.SetFocus
Me.frmCarSub.Form.Filter=“[CarNum]=””和[cmbCar]&“
Me.frmCarSub.Form.FilterOn=True
端接头
Private Sub-cmbType_AfterUpdate()
Me.cmbGroup.Value=“”
Me.cmbCar.Value=“”
Me.frmCarSub.SetFocus
Me.frmCarSub.Form.Filter=“[TypeName]=”、[cmbType]、“”
Me.frmCarSub.Form.FilterOn=True
端接头
Private Sub-cmbGroup_AfterUpdate()
Me.cmbCar.Value=“”
Me.cmbType.Value=“”
Me.frmCarSub.SetFocus
Me.frmCarSub.Form.Filter=“[CarGroupName]=”、[cmbGroup]&“
Me.frmCarSub.Form.FilterOn=True
端接头
我将此代码用于btnPrint按钮

Private Sub btnPrint\u Click()
如果为空([cmbCar]),则
DoCmd.OpenReport“rptCar”,acViewPreview
其他的
DoCmd.OpenReport“rptCar”,acViewPreview,“[CarNum]=”、[cmbCar]&”
如果结束
端接头
但这段代码的问题是,我必须为三个菜单使用三个按钮,这是不合逻辑的


谢谢。

您可以使用表单模块定义如下函数:

Function FilterString() As String
    If Not IsNull(cmbCar) Then FilterString = " AND [CarNum]= '" & cmbCar & "'"
    If Not IsNull(cmbType) Then FilterString = FilterString & " AND [TypeName]= '" & cmbType & "'"
    If Not IsNull(cmbGroup) Then FilterString = FilterString & " AND [CarGroupName]= '" & cmbGroup & "'"

    FilterString = Mid(FilterString, 6)
End Function
然后,定义另一个函数,例如:

Function SetFilter()
    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = FilterString
    Me.frmCarSub.Form.FilterOn = True
End Function
然后,每个组合框的事件处理程序变为:

Private Sub cmbCar_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbType_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbGroup_AfterUpdate()
    SetFilter
End Sub
最后,打印按钮事件处理程序可以变成:

Private Sub btnPrint_Click()
    If FilterString = vbNullString Then
        DoCmd.OpenReport "rptCar", acViewPreview
    Else
        DoCmd.OpenReport "rptCar", acViewPreview, , FilterString
    End If
End Sub

用户还可以按多个字段进行筛选。

您可以使用表单的模块定义如下功能:

Function FilterString() As String
    If Not IsNull(cmbCar) Then FilterString = " AND [CarNum]= '" & cmbCar & "'"
    If Not IsNull(cmbType) Then FilterString = FilterString & " AND [TypeName]= '" & cmbType & "'"
    If Not IsNull(cmbGroup) Then FilterString = FilterString & " AND [CarGroupName]= '" & cmbGroup & "'"

    FilterString = Mid(FilterString, 6)
End Function
然后,定义另一个函数,例如:

Function SetFilter()
    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = FilterString
    Me.frmCarSub.Form.FilterOn = True
End Function
然后,每个组合框的事件处理程序变为:

Private Sub cmbCar_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbType_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbGroup_AfterUpdate()
    SetFilter
End Sub
最后,打印按钮事件处理程序可以变成:

Private Sub btnPrint_Click()
    If FilterString = vbNullString Then
        DoCmd.OpenReport "rptCar", acViewPreview
    Else
        DoCmd.OpenReport "rptCar", acViewPreview, , FilterString
    End If
End Sub

用户还可以按多个字段进行筛选。

根据是否做出选择,有条件地从3个组合框中构建筛选条件。复习。如果选择了cmbCar中的特定车辆,则不需要cmbType和CMBGOUP参数。根据是否进行选择,有条件地从3个组合框中生成筛选条件。复习。如果选择了来自cmbCar的特定车辆,则不需要cmbType和cmbGroup参数。