Ms access 访问表单上的动态编码过滤器
我在access中有一个连续表单,在标题中有3个组合框来过滤数据。目前,我有一个相当长的嵌套IF-to来检查使用了多少个组合框,并覆盖了所有8个渗透。有3个盒子还不错,但我可能会加上第4个甚至第5个,在这种情况下,它会变得很可笑 是否有更简单的方法为连续表单设置组合框过滤器 当前代码Ms access 访问表单上的动态编码过滤器,ms-access,filter,ms-access-2007,vba,Ms Access,Filter,Ms Access 2007,Vba,我在access中有一个连续表单,在标题中有3个组合框来过滤数据。目前,我有一个相当长的嵌套IF-to来检查使用了多少个组合框,并覆盖了所有8个渗透。有3个盒子还不错,但我可能会加上第4个甚至第5个,在这种情况下,它会变得很可笑 是否有更简单的方法为连续表单设置组合框过滤器 当前代码 Private Sub filters() Dim fstr As String, rgS As String, piS As String, hcS As String rgS = "resear
Private Sub filters()
Dim fstr As String, rgS As String, piS As String, hcS As String
rgS = "research_group_id = " & Me.fRG
piS = "pi_id = " & Me.fPI
hcS = "healthcat_id = " & Me.fHC
If IsNull(Me.fRG) Then
If IsNull(Me.fPI) Then
If IsNull(Me.fHC) Then
' Do Nothing
Else
fstr = hcS
Call filton(Me.Name, fstr)
End If
Else
If IsNull(Me.fHC) Then
fstr = piS
Call filton(Me.Name, fstr)
Else
fstr = piS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
End If
Else
If IsNull(Me.fPI) Then
If IsNull(Me.fHC) Then
fstr = rgS
Call filton(Me.Name, fstr)
Else
fstr = rgS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
Else
If IsNull(Me.fHC) Then
fstr = rgS & " AND " & piS
Call filton(Me.Name, fstr)
Else
fstr = rgS & " AND " & piS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
End If
End If
End Sub
以上代码在更新每个组合框后激发
Public Function filton(frmname As String, fstr As String)
With Forms(frmname)
.FilterOn = False
.Filter = fstr
.FilterOn = True
End With
End Function
您可以在组合框上创建更新后事件。下面是一个三层继承权的示例,其中在加载时禁用父组合框和子组合框
Private Sub Grandfather_Combo_AfterUpdate()
Parent_Combo.RowSource="SELECT ...."
Parent_Combo.Enabled=True
Child_Combo.Enabled=False ' the child is invalid until the parent is defined
End Sub
Private Sub Parent_Combo_AfterUpdate()
Child_Combo.RowSource="SELECT ...."
Child_Combo.Enabled=True
End Sub
这是一个单记录表单,但如果您想更改组合框,应该可以开始
如果要更改的是记录筛选器,则可以使用相同的事件,但可以更改相关字段的筛选器变量,然后调用公共子例程,从所有筛选器变量的组合中重新创建表单筛选器。将带有
和“
的每个条件添加到筛选器字符串中。然后,从该字符串中丢弃前导的和“
”。这种方法应该很容易适应任何数量的标准
不确定我是否正确匹配了下面代码中的所有内容,但希望模式是清晰的
如果不为空(Me.fRG),则
fstr=fstr&“和”&rgS
如果结束
如果不是IsNull(Me.fPI),那么
fstr=fstr&“和”&piS
如果结束
如果不为空(Me.fHC),则
fstr=fstr&“和”&hcS
如果结束
如果Len(fstr)>0,则
“放弃前导”和
fstr=Mid(fstr,6)
如果结束
对不起,我应该说上述代码是在每个组合框更新后触发的OK,我支持我的立场。Individual AfterUpdate()设置form_level变量,公共子例程以更改筛选器。组合框没有分层。用户可以选择1、2或3的任意组合。抱歉,第二个选项。现在没有时间改变这个例子。太好了。起初并不认为它有效,但忘记在最后添加callfilton(me.name,fstr)
。谢谢!没有看到已删除的注释,但在没有vbnullstring
的情况下,它可以正常工作。