Vba 忽略空的组合框

Vba 忽略空的组合框,vba,ms-access,combobox,ms-access-2007,Vba,Ms Access,Combobox,Ms Access 2007,我有5个组合框,用于过滤列表框。我想让它,所以不是所有的5必须被选中,以使过滤器的工作。每个组合框以空白(“”)开头,我希望能够跳过1个或多个组合框,并使用我选择的组合框进行筛选。以下是其中一个组合框的更新后代码: On Error Resume Next 'These are the comboboxes Me.BilletMaterial.RowSource = [MechanicalData.Billet Material] Me.BilletNumber.RowSo

我有5个组合框,用于过滤列表框。我想让它,所以不是所有的5必须被选中,以使过滤器的工作。每个组合框以空白(“”)开头,我希望能够跳过1个或多个组合框,并使用我选择的组合框进行筛选。以下是其中一个组合框的更新后代码:

On Error Resume Next

    'These are the comboboxes
   Me.BilletMaterial.RowSource = [MechanicalData.Billet Material]
   Me.BilletNumber.RowSource = [MechanicalData.Billet Number]
   Me.TestType.RowSource = [MechanicalData.Test Type]
   Me.Axis.RowSource = [MechanicalData.Axis]
   Me.Temperature.RowSource = [MechanicalData.Temperature]

   Me.BilletMaterial.Requery    
   Me.BilletNumber.Requery
   Me.TestType.Requery
   Me.Axis.Requery
   Me.Temperature.Requery
'Listbox
Me.DataView.RowSource = "SELECT [Billet Material],[Billet Number], " & _
"[Specimen],[Temperature],[Modulus],[Ultimate Tensile Strength],[Strain]  " & _
"FROM MechanicalData " & _
"WHERE 1=1 " & _
"AND [MechanicalData.Axis] = '" & Me.Axis.Value & "'  " & _
"AND [MechanicalData.Test Type] = '" & TestType.Value & "' " & _
"AND [MechanicalData.Temperature] = " & Temperature.Value & " " & _
"AND If (Not IsNull(BilletNumber.Value)) Then [MechanicalData.Billet Number] = " & BilletNumber.Value & " End if  " & _
"AND [MechanicalData.Billet Material] = '" & BilletMaterial.Value & "' "
我的第一个想法是在SELECT语句的WHERE部分实现多个“if not empty…”语句,但我不知道如何实现,甚至不知道是否可能

我知道这行的语法是错误的

"AND If (Not IsNull(BilletNumber.Value)) Then [MechanicalData.Billet Number] = " & BilletNumber.Value & " End if  " & _

我相信您上面的代码缺少“FROM MechanicalData”子句。使用上面的建议,以下操作应该有效(假设所有combobox值都不是数字):

这应该起作用:

'Listbox
Me.DataView.RowSource = "SELECT [Billet Material],[Billet Number], " & _
"[Specimen],[Temperature],[Modulus],[Ultimate Tensile Strength],[Strain]  " & _
"FROM MechanicalData " & _
"WHERE 1=1 " & _
"AND [MechanicalData.Axis] = '" & Nz(Me.Axis.Value, '*') & "'  " & _
"AND [MechanicalData.Test Type] = '" & Nz(TestType.Value, '*') & "' " & _
"AND [MechanicalData.Temperature] = " & Nz(Temperature.Value, '*') & " " & _
"AND If (Not IsNull(BilletNumber.Value)) Then [MechanicalData.Billet Number] = " & BilletNumber.Value & " End if  " & _
"AND [MechanicalData.Billet Material] = '" & Nz(BilletMaterial.Value, '*') & "' "
您可能需要调整它以获得正确的单引号/双引号,但是使用

Nz(SomeControl.Value,“*”)


绝对是返回所有值的有效方法。

为什么不使用
If(非IsNull(组合))构建WHERE字符串,然后strWhere=strWhere&
@Remou在注释中是'strWhere=strWhere',相当于[MechanicalData.Axis]='“&Me.Axis.Value&'”(等)在我的代码中?是的,只需建立where statemet。你可能想从
where 1=1
开始,这样其他一切都可以
和this=that
@Remou我根据你的建议在我的帖子底部添加了一行代码。我还不太熟悉正确的语法,所以如果你能引导我朝着正确的方向去做,那就太好了非常有帮助。我认为您没有正确地使用字符串连接。它应该看起来像
和[MechanicalData.Axis]=“&Me.Axis.Value&”
。不需要单引号。这以前确实有效吗?另外,当我在组合框中检查空值时,我使用了Remou描述的方法(除非我使用
如果IsNull(Object.Value)=False那么
)FROM子句在我复制粘贴自的代码中。奇怪。我会重新编辑它。另外,这些组合框中有2个是数字。我刚刚将我筛选的表中的列全部更改为文本,每当我从设计视图切换到表单视图时,都会弹出一个对话框,上面写着““条件表达式中的数据类型不匹配”,但随后一切正常属性表中的Rowsource令人不快。我删除了它,一切正常。谢谢!是的,对于任何定义为数字的字段,只需从构建WHERE子句的代码中删除周围的引号。。。
'Listbox
Me.DataView.RowSource = "SELECT [Billet Material],[Billet Number], " & _
"[Specimen],[Temperature],[Modulus],[Ultimate Tensile Strength],[Strain]  " & _
"FROM MechanicalData " & _
"WHERE 1=1 " & _
"AND [MechanicalData.Axis] = '" & Nz(Me.Axis.Value, '*') & "'  " & _
"AND [MechanicalData.Test Type] = '" & Nz(TestType.Value, '*') & "' " & _
"AND [MechanicalData.Temperature] = " & Nz(Temperature.Value, '*') & " " & _
"AND If (Not IsNull(BilletNumber.Value)) Then [MechanicalData.Billet Number] = " & BilletNumber.Value & " End if  " & _
"AND [MechanicalData.Billet Material] = '" & Nz(BilletMaterial.Value, '*') & "' "