我确实希望在VBA中创建一个多重过滤器功能,以便从主窗体上的控件中对子窗体进行排序。
这是我的代码
{{1}}
但是我在查询表达式中不断收到运行时错误3075(语法错误(缺少运算符)。
我可以在错误消息中看到我的变量。
我知道我的查询表达式格式不正确。但我无法理解。
答案 0 :(得分:2)
好吧,我觉得有必要回答这个问题,因为看起来你从根本上说没有得到什么,或者不止一件事,而且我没有接受我的评论。
我不知道你是不是只是在不理解它的情况下复制和粘贴代码,或者是如此匆忙,以至于你没有花时间去理解代码。
让我们从:
开始这段代码
lngLen = Len(strWhere) - 5 If lngLen <= 0 Then MsgBox "No criteria", vbInformation, "Nothing to do." Else
应该摆脱那条尾巴
不,不是。
lngLen = Len(strWhere) - 5
If lngLen <= 0 Then
MsgBox "No criteria", vbInformation, "Nothing to do."
Else
Debug.Print strWhere
Me.Sub_Desi_Schedule.Form.Filter = strWhere
Me.Sub_Desi_Schedule.Form.FilterOn = True
End If
做两件事。它将lngLen
设置为等于strWhere
变量的长度减去5.然后检查长度是否小于或等于0.
如果您的strWhere
声明是......
([PNum] = 27) AND
...你要将lngLen
设为13。
由于13不小于或等于零,我们将进入您的ELSE
语句,并设置过滤器。
Me.Sub_Desi_Schedule.Form.Filter = strWhere
哪个成为
Me.Sub_Desi_Schedule.Form.Filter = "([PNum] = 27) AND "
请参阅?您仍然得到了结尾AND
,因为您永远不会更新strWhere
变量。
以下是我在两种情况下尝试
Me.Sub_Desi_Schedule.Form.Filter = Len(strWhere) - 5
和Me.Sub_Desi_Schedule.Form.Filter = lngLen
的情况,错误消失了。但是没有应用过滤器。
所以现在你正在做
Me.Sub_Desi_Schedule.Form.Filter = Len(strWhere) - 5`
相当于
Me.Sub_Desi_Schedule.Form.Filter = 13
这没有任何成就。您将过滤器设置为等于变量的长度,而不是实际的strWhere
变量。如果在代码中添加任何断点,这应该是显而易见的。
我建议使用LEFT
修剪字符串,如下所示:
strWhere = LEFT(strWhere, lngLen)
这就是它的全部内容。