Excel 多参数查询,但如果保留为空,则忽略它
我正在尝试创建一个自动化仪表板,用户可以在其中选择要在Excel中运行的报告类型,这将影响单元格中的参数类型,从而影响MS Access中的查询(使用MS查询功能) 我的问题是,我一辈子都无法想出如何让这项工作成功。例如,Access中的数据表具有以下功能: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 我希望能够使用以下参数运行查询,以便仅返回以下值:
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(查询 组合框)
- 创建两个表
- 创建表单和控件(报表组合框、选择条件、, 重置按钮、运行按钮)
- 对于每个控件,将默认值设置为:=“*”或任何您需要的值 需要
- 用所需数据填充两个表(每个报告的选项, 格式化位置等)
- 为报表创建一个查询,该查询使用允许选项的选择条件,如:
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