【问题标题】:Ignore an empty combobox忽略一个空的组合框
【发布时间】:2014-05-24 17:14:43
【问题描述】:

我有 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 is not empty...”语句,但我不确定如何做到这一点,或者即使有可能。

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

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

【问题讨论】:

  • 为什么不使用If (Not IsNull(Combo)) Then strWhere = strWhere & 构建WHERE字符串
  • @Remou is 'strWhere = strWhere' 在您的评论中相当于我的代码中的 [MechanicalData.Axis] = '" & Me.Axis.Value & "'" (etc)?
  • 是的,只需建立 where 语句。您可能想以WHERE 1=1 开头,所以其他所有内容都可以是AND this=that
  • @Remou 我在帖子底部根据您的建议添加了一行代码。我对正确的语法还不太熟悉,所以如果你能引导我朝着正确的方向前进,那将非常有帮助。
  • 我认为您没有正确使用字符串连接。它应该看起来像 AND [MechanicalData.Axis] = " & Me.Axis.Value & " .. 不需要单引号。这以前真的有效吗?另外,当我检查组合框中的 Null 值时,我使用了 Remou 描述的方法(除了我使用 If IsNull (Object.Value) = False Then

标签: vba ms-access combobox ms-access-2007


【解决方案1】:

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

Dim strWhere    As String

strWhere = " WHERE (1=1)"
If Not IsNull(Axis.Value) Then strWhere = strWhere & " AND ([MechanicalData.Axis] = '" & Axis.Value & "') "
If Not IsNull(TestType.Value) Then strWhere = strWhere & " AND ([MechanicalData.Test Type] = '" & TestType.Value & "') "
If Not IsNull(Temperature.Value) Then strWhere = strWhere & " AND ([MechanicalData.Temperature] = '" & Temperature.Value & "') "
If Not IsNull(BilletNumber.Value) Then strWhere = strWhere & " AND ([MechanicalData.Billet Number] = '" & BilletNumber.Value & "') "
If Not IsNull(BilletMaterial.Value) Then strWhere = strWhere & " AND ([MechanicalData.Billet Material] = '" & BilletMaterial.Value & "') "

Me.DataView.RowSource = "SELECT [Billet Material],[Billet Number], " & _
        "[Specimen],[Temperature],[Modulus],[Ultimate Tensile Strength],[Strain] " & _
        "From MechanicalData " & _
        strWhere

【讨论】:

  • FROM 子句在我复制粘贴的代码中。奇怪的。我会重新编辑它。此外,其中 2 个组合框是数字
  • 我只是将要过滤的表中的列全部更改为文本,每当我从设计视图切换到表单视图时,我都会弹出一个显示“条件表达式中的数据类型不匹配”的弹出窗口,但后来一切正常
  • 属性表中的 Rowsource 只是令人不快。我删除了它,一切都很顺利。谢谢!
  • 是的,对于任何定义为数字的字段,只需从构建 WHERE 子句的代码中删除周围的引号...
【解决方案2】:

这应该可行:

'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, "*")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    相关资源
    最近更新 更多