Excel 多参数查询,但如果保留为空,则忽略它

Excel 多参数查询,但如果保留为空,则忽略它,excel,ms-access,ms-query,Excel,Ms Access,Ms Query,我正在尝试创建一个自动化仪表板,用户可以在其中选择要在Excel中运行的报告类型,这将影响单元格中的参数类型,从而影响MS Access中的查询(使用MS查询功能) 我的问题是,我一辈子都无法想出如何让这项工作成功。例如,Access中的数据表具有以下功能: Col1 Col2 Col3 Col4 Date Apples Pumpkin Cars Oranges Potato Trucks Grapes 我希望能够使用以下参数运行查询,以便仅返回以下值:

我正在尝试创建一个自动化仪表板,用户可以在其中选择要在Excel中运行的报告类型,这将影响单元格中的参数类型,从而影响MS Access中的查询(使用MS查询功能)

我的问题是,我一辈子都无法想出如何让这项工作成功。例如,Access中的数据表具有以下功能:

Col1 Col2    Col3    Col4

Date Apples  Pumpkin Cars
     Oranges Potato  Trucks
     Grapes
我希望能够使用以下参数运行查询,以便仅返回以下值:

枣苹果橙子南瓜土豆车

但是,有人选择的下一个报告可能具有以下内容:

Col1 Col2    Col3    Col4

Date Apples  Pumpkin Cars
     Oranges Potato  Trucks
     Grapes
枣苹果橙子葡萄南瓜车

有人知道我该怎么做吗?基本上,如果未选择参数,则返回表中的所有值


我想我已经成功地解释清楚了

这将描述一个简单的方法,该方法提供一个表单(frmReportChooser),允许用户选择任何报告。选择后,将向用户显示用于筛选该报告的自定义控件列表,并允许用户为任何筛选器组合设置值

下面的代码是从我们使用的表单中提取的,机密名称/信息已被删除

如果您有任何问题,请告诉我

此代码使用以下两个表:

  • ctrlReports:ID、ReportName、ObjectName、BaseQueryName
  • ctrlReportOptions:ID、ReportName、OptionOrder、ControlName、, COntrolTop、ControlLeft、SkipLabel(是/否)、ctlRecordSource(查询 组合框)

  • 创建两个表
  • 创建表单和控件(报表组合框、选择条件、, 重置按钮、运行按钮)
  • 对于每个控件,将默认值设置为:=“*”或任何您需要的值 需要
  • 用所需数据填充两个表(每个报告的选项, 格式化位置等)
  • 为报表创建一个查询,该查询使用允许选项的选择条件,如:
=[表格]![frmReportChooser]![txtFiscalYear](将具有默认值“*”或您选择/输入的值

形式:frmReportChooser主子程序

当用户从组合框“cboChooseReport”中选择报告时

    Private Sub cboChooseReport_Change()
Dim strSQL      As String
Dim rs          As ADODB.Recordset
Dim i           As Integer
Dim iTop        As Integer
Dim iLeft       As Integer
Dim iLblTop     As Integer
Dim iLblLeft    As Integer
Dim iLblWidth   As Integer
Dim iTab        As Integer
Dim strLabel    As String

1000        On Error GoTo Error_Trap
1020        strSQL = "SELECT ctrlReportOptions.ControlName, 'lbl' & Mid([ControlName],4,99) AS LabelName, SkipLabel " & _
                "From ctrlReportOptions WHERE (((ctrlReportOptions.ID)<>0)) " & _
                "GROUP BY ctrlReportOptions.ControlName, 'lbl' & Mid([ControlName],4,99), SkipLabel;"
1080        Set rs = New ADODB.Recordset
1100        rs.Open strSQL, CurrentProject.Connection, adOpenDynamic

1120        Do While Not rs.EOF
1140            Me(rs!ControlName).visible = False
1160            If rs!skiplabel = False Then
1180                Me(rs!LabelName).visible = False
1200            End If
1220            rs.MoveNext
1240        Loop
1260        rs.Close

1280        iTop = 0
1300        iTab = 0

1301        If IsNull(Me.cboChooseReport.Column(3)) Or Me.cboChooseReport.Column(3) = "" Then
1302            MsgBox "The field where you select a report is either empty or is missing an internal ID number." & _
            vbCrLf & vbCrLf & _
            "Please be sure you have selected a report.", vbOKOnly, "Missing Parameter"
1303            GoTo Proc_Exit
1305        End If

1320        strSQL = "select * from ctrlReportOptions " & _
                        "where [ID] = " & Me.cboChooseReport.Column(3) & _
                        " order by OptionOrder;"
1380        Set rs = New ADODB.Recordset
1400        rs.Open strSQL, CurrentProject.Connection, adOpenDynamic

1420        If rs.EOF Then
1440            Me.cmdShowQuery.visible = True
1460            Me.lblReportCriteria.visible = False
1480            Me.cmdShowQuery.Left = 2000
1500            Me.cmdShowQuery.Top = 1500
1520            Me.cmdShowQuery.TabIndex = 1
1540            Me.cmdReset.visible = False
1560            rs.Close
1580            Set rs = Nothing
1600            GoTo Proc_Exit
1620        End If

1640        Me.lblReportCriteria.visible = True
1660        Do While Not rs.EOF
1680            If rs!skiplabel = False Then
1700                strLabel = "lbl" & Mid(rs!ControlName, 4)
1720                iLblWidth = Me.Controls(strLabel).Width
1740                Me(strLabel).Top = rs!ControlTop
1760                Me(strLabel).Left = rs!ControlLeft - (Me(strLabel).Width + 50)
1780                Me(strLabel).visible = True
1820            End If
1840            iTab = iTab + 1
1860            Me(rs!ControlName).Top = rs!ControlTop
1880            Me(rs!ControlName).Left = rs!ControlLeft
1900            Me(rs!ControlName).visible = True
1920            If Left(rs!ControlName, 3) <> "lbl" Then
1940                Me(rs!ControlName).TabIndex = iTab
1960            End If
1980            If Me(rs!ControlName).Top >= iTop Then
2000                iTop = rs!ControlTop + Me(rs!ControlName).Height          ' Save last one
2020            End If

2040            If Left(rs!ControlName, 3) <> "lbl" And Left(rs!ControlName, 3) <> "cmd" Then
2060                If Me(rs!ControlName).DefaultValue = "=""*""" Then
'
2080                ElseIf Left(Me(rs!ControlName).DefaultValue, 2) = "=#" And Right(Me(rs!ControlName).DefaultValue, 1) = "#" Then
2100                    i = Len(Me(rs!ControlName).DefaultValue)
'
2120                ElseIf Me(rs!ControlName).DefaultValue = "True" Then
'
2140                ElseIf Me(rs!ControlName).DefaultValue = "False" Then
'
2160                End If
2180            Else
2200                If Me(rs!ControlName).Top + Me(rs!ControlName).Height >= iTop     Then
2220                    iTop = rs!ControlTop + Me(rs!ControlName).Height          ' Save last one
2240                End If
2260            End If
2280            rs.MoveNext
2300        Loop
2320        rs.Close
2340        Set rs = Nothing

2360        If Me.cboChooseReport.Column(1) <> "<<my special report>>" Then
2380            Me.cmdShowQuery.visible = True
2400            Me.cmdShowQuery.Left = 2000
2420            Me.cmdShowQuery.Top = iTop + 300
2440            iTab = iTab + 1
2460            Me.cmdShowQuery.TabIndex = iTab
2480        Else
2500            Me.cmdShowQuery.visible = False
2520        End If
2540        Me.cmdReset.visible = True
2560        Me.cmdReset.Left = 5000
2580        Me.cmdReset.Top = iTop + 300
2600        Me.cmdReset.TabIndex = iTab + 1

2620 Proc_Exit:
2640        Exit Sub
2660 Error_Trap:
2680        Err.Source = "Form_frmReportChooser: cboChooseReport_Change  at Line: " & Erl
2700        DocAndShowError
2720        Resume Proc_Exit
2740        Resume Next
2760        Resume
End Sub

Private Sub cmdReset_Click()
1000    On Error GoTo Error_Trap
1020    Me.cboFiscalYear.value = Eval(Mid$(Me. cboFiscalYear.DefaultValue, 2))
1040    Me.cboPart.value = Eval(Mid$(Me.cboPart.DefaultValue, 2))

1220    Me.chkYesNo = False
. . . 
1560    Me.txtStartDate.value = Eval(Mid$(Me. txtStartDate.DefaultValue, 2, 10))
. . .
1660    Me.Requery
1680    Me.Refresh
1700 Proc_Exit:
1720    Exit Sub
1740 Error_Trap:
1760    Err.Source = "Form_frmReportChooser: cmdReset_Click  at Line: " & Erl
1780    DocAndShowError
1800    Resume Proc_Exit
1820    Resume Next
End Sub
Private Sub cboChooseReport_Change()
作为字符串的Dim strSQL
将rs设置为ADODB.Recordset
作为整数的Dim i
将iTop设置为整数
Dim iLeft作为整数
Dim iLblTop作为整数
Dim iLblLeft作为整数
Dim iLblWidth为整数
将iTab设置为整数
作为字符串的Dim strLabel
1000 On错误转到错误陷阱
1020 strSQL=“选择ctrlReportOptions.ControlName,'lbl'和Mid([ControlName],4,99)作为LabelName,SkipLabel”和_
“来自ctrlReportOptions,其中(((ctrlReportOptions.ID)0))”&_
“按ctrlReportOptions.ControlName,'lbl'和Mid([ControlName],4,99)分组,SkipLabel;”
1080集rs=新ADODB.Recordset
1100 rs.打开strSQL,CurrentProject.连接,adOpenDynamic
1120做而不做rs.EOF
1140 Me(rs!ControlName).visible=False
1160如果rs!skiplabel=False,则
1180 Me(rs!LabelName).visible=False
1200如果结束
1220卢比
1240环路
1260卢比。收盘
1280 iTop=0
1300 iTab=0
1301如果IsNull(Me.cbocoosereport.Column(3))或Me.cbocoosereport.Column(3)=“”,则
1302 MsgBox“选择报告的字段为空或缺少内部ID号。”_
vbCrLf&vbCrLf&_
“请确保已选择报表。”,vbOKOnly,“缺少参数”
1303转到程序出口
1305结束如果
1320 strSQL=“从ctrlReportOptions中选择*_
“where[ID]=”&Me.cboChooseReport.Column(3)和_
“按选择订单订购;”
1380集rs=新ADODB.Recordset
1400 rs.打开strSQL,CurrentProject.连接,adOpenDynamic
1420如果为rs.EOF,则
1440 Me.cmdShowQuery.visible=True
1460 Me.lblReportCriteria.visible=False
1480 Me.cmdShowQuery.Left=2000
1500 Me.cmdShowQuery.Top=1500
1520 Me.cmdShowQuery.TabIndex=1
1540 Me.cmdReset.visible=False
1560卢比。收盘
1580组rs=无
1600转到程序出口
1620结束如果
1640 Me.lblReportCriteria.visible=True
1660做而不做rs.EOF
1680如果rs!skiplabel=False,则
1700 strLabel=“lbl”和Mid(rs!ControlName,4)
1720 iLblWidth=Me.Controls(strLabel).Width
1740 Me(标准标签)。顶部=rs!控制顶部
1760 Me(标准标签)。左=rs!控制器左-(Me(标准标签)。宽度+50)
1780 Me(标准标签)。可见=真实
1820完
1840 iTab=iTab+1
1860 Me(rs!ControlName).Top=rs!ControlTop
1880 Me(rs!ControlName).Left=rs!ControlLeft
1900 Me(rs!ControlName).visible=True
1920如果左(rs!ControlName,3)“lbl”,则
1940 Me(rs!ControlName).TabIndex=iTab
1960结束如果
1980如果我(rs!ControlName).Top>=iTop那么
2000 iTop=rs!ControlTop+Me(rs!ControlName)。高度“保存最后一个”
2020年结束,如果
2040如果左(rs!ControlName,3)“lbl”和左(rs!ControlName,3)“cmd”,则
2060如果Me(rs!ControlName).DefaultValue=“=”*”,则
'
2080如果左(Me(rs!ControlName).DefaultValue,2)=“=#”,右(Me(rs!ControlName).DefaultValue,1)=“#”,则
2100 i=Len(Me(rs!ControlName).DefaultValue)
'
2120 ElseIf Me(rs!ControlName).DefaultValue=“True”然后
'
2140 ElseIf Me(rs!ControlName).DefaultValue=“False”然后
'
2160如果结束
2180