Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba MS Access下拉列表以筛选表格_Vba_Ms Access_Filter - Fatal编程技术网

Vba MS Access下拉列表以筛选表格

Vba MS Access下拉列表以筛选表格,vba,ms-access,filter,Vba,Ms Access,Filter,我有一个很大的表,并且创建了一个表单来过滤这些数据。 然而,目前,这些过滤器不起作用。 有12个下拉过滤器对应于列,其思想是从特定列中选择一个值,并获得仅具有choosen值的行,如果必要,还可以一次过滤几列,如有必要-每个框的代码基本相同,只是名称的更改。 以下是一个方框代码示例: Private Sub cboSRat_AfterUpdate() Dim mySRat As String mySRat = "Select * from Lieferant where

我有一个很大的表,并且创建了一个表单来过滤这些数据。 然而,目前,这些过滤器不起作用。 有12个下拉过滤器对应于列,其思想是从特定列中选择一个值,并获得仅具有choosen值的行,如果必要,还可以一次过滤几列,如有必要-每个框的代码基本相同,只是名称的更改。 以下是一个方框代码示例:

Private Sub cboSRat_AfterUpdate()
    Dim mySRat As String
    mySRat = "Select * from Lieferant where ([Bezeichner] = '" & Me.cboLiefName & "') and ([S_Rating] = '" & Me.cboSRat & "') and ([Verantwortlicher] = '" & Me.cboVerant & "') and ([Lieferantenkategorie] = '" & Me.cboLiefKat & "') and ([Lieferantenart] = '" & Me.cboliefart & "') and ([Land] = '" & Me.cboLand & "') and ([Audit_Ergebnis] = '" & Me.cboAudErg & "')"
    Me.Form.RecordSource = mySRat
    Me.Form.Requery
    
End Sub
有人能帮我修改代码让它工作吗? 提前感谢

无论如何,您(您的代码)必须扩展where子句,例如:

myLieferantName = "Select * from Lieferant where [Bezeichner] = '" & Me.cboLiefName & "' And [Land] = '" & Me.cboLand & "'"
作为旁注,调整记录源后不需要重新查询:

Me.RecordSource = myLieferantName
' Me.Form.Requery

如果我猜,您的问题是,即使选择一个或多个但不是所有的组合框(即,将一些组合框留空),也不会返回任何行。根据您尝试的查询,这不是错误,而是SQL逻辑的有效结果。您的用户需要在所有七个组合框中正确选择值才能返回任何行

此动态筛选问题的一个解决方案是使用
NZ
(或
IIF
)为未选择的组合框将每个字段与其自身匹配。此外,还可以使用保存的SQL查询,该查询指向表单控件,而无需任何VBA值串联和引号标点

如果选择了任何一个或所有控件,下面将返回值。但请注意,选择组合框后,将只返回所有字段中非空的行。确保在查询中将
myForm
调整为实际表单名称:

SQL(另存为单独的查询和要形成的记录源)

选择*
来自中尉
其中[Bezeichner]=NZ(Forms!myForm!cboLiefName[Bezeichner])
和[S_评级]=NZ(Forms!myForm!cboSRat[S_评级])
和[Verantwortlicher]=NZ(Forms!myForm!cboVerant[Verantwortlicher])
和[Lieferantenkategorie]=NZ(Forms!myForm!cboLiefKat[Lieferantenkategorie])
和[Lieferantenart]=NZ(Forms!myForm!cboliefart[Lieferantenart])
和[Land]=NZ(Forms!myForm!cboLand[Land])
和[Audit_Ergebnis]=NZ(Forms!myForm!cboAudErg[Audit_Ergebnis])
VBA(单行!)

Private Sub cboSRat_AfterUpdate()
Me.Form.Requery
端接头

如果需要捕获具有潜在
NULL
s的行,请集成
条件:

SQL

选择*
来自中尉
其中([Bezeichner]=NZ(Forms!myForm!cboLiefName,[Bezeichner])
或(Forms!myForm!cboLiefName为NULL,[Bezeichner]为NULL)
)
和([S_评级]=NZ(Forms!myForm!cboSRat[S_评级])
或者(Forms!myForm!cboSRat为空,[S_Rating]为空)
)
和([Verantwortlicher]=NZ(Forms!myForm!cboVerant[Verantwortlicher])
或者(Forms!myForm!cboVerant为NULL,[Verantwortlicher]为NULL)
)
和([Lieferantenkategorie]=NZ(Forms!myForm!cboLiefKat[Lieferantenkategorie])
或者(Forms!myForm!cboLiefKat为NULL,[Lieferantenkategorie]为NULL)
)
和([Lieferanteart]=NZ(Forms!myForm!cboliefart[Lieferanteart])
或者(Forms!myForm!cboliefart为NULL,[Lieferanteart]为NULL)
)
和([Land]=NZ(Forms!myForm!cboLand,[Land])
或者(Forms!myForm!cboLand为NULL,[Land]为NULL)
)
和([Audit_Ergebnis]=NZ(Forms!myForm!cboAudErg[Audit_Ergebnis])
或者(Forms!myForm!cboAudErg和[Audit_Ergebnis]为空)
)

但如果我输入AND,那么所有下拉列表都必须更新吗?另外,我是否应该像上面的代码一样,将每个代码片段放入SELECT query ALL下拉列表中?一般方法是构建并连接where子句,以便只包含那些值不为Null的组合框。创建一个函数来实现这一点,并从每个组合框的
AfterUpdate
事件调用它。如何创建这样的函数?我是vba新手,这就是我提出问题的原因。这里有一种方法:。嘿,我编辑了我的问题和代码,因为它仍然不起作用,你能给我一个建议吗?请解释一下它不起作用,这对我们没有帮助。你收到错误了吗?当组合框被更改时,您是否会收到不需要的结果,如表单过滤掉所有内容?将此sql查询保存在何处?以及在何处添加recordsource?将查询与任何其他Access对象(表、窗体、报表、宏、模块)一样保存在数据库中。具体来说,在查询设计中,将此查询放在SQL视图中并保存。然后,在表单设计中,将此命名查询分配给表单的Recordsource属性。