VBA中如何校验表字段匹配ArrayList后将对应记录展示到下一表单
解决方案
问题原因
你原有代码不生效的核心原因是:DoCmd.OpenForm的WhereCondition参数接收的是符合Access SQL语法的筛选字符串,会直接传给Access数据库引擎执行,无法识别VBA的ArrayList对象以及Contains方法,因此你写的VBA逻辑在这里不会被执行。
你的表单控件已经绑定了目标表对应列,不需要手动给文本框赋值,只要正确筛选表单的记录源,匹配的记录会自动填充到绑定控件中。
推荐实现方案
直接将ArrayList中的值拼接为SQL支持的IN条件字符串,传入WhereCondition参数即可,不需要修改下一个表单的任何代码:
Public Sub Command42_Click() Dim NotTrained As ArrayList Set NotTrained = New ArrayList NotTrained.Add "value1" NotTrained.Add "value2" Dim filterValues As String, i As Integer ' 遍历ArrayList拼接为单引号包裹、逗号分隔的格式,同时转义值内的单引号避免SQL报错 For i = 0 To NotTrained.Count - 1 filterValues = filterValues & "'" & Replace(NotTrained(i), "'", "''") & "'," Next ' 移除末尾多余的逗号 If Len(filterValues) > 0 Then filterValues = Left(filterValues, Len(filterValues) - 1) ' 构造完整筛选条件 Dim whereCond As String whereCond = "handover_No IN (" & filterValues & ")" ' 打开表单时自动应用筛选,绑定控件会自动加载匹配记录的对应值 DoCmd.OpenForm "form_name", WhereCondition:=whereCond End Sub
注意事项
- 如果
handover_No是数字类型的字段,拼接值时不需要包裹单引号,直接写值即可 - 如果匹配结果有多条记录,需要将下一个表单的默认视图改为「连续表单」或「数据表视图」,否则默认的单个表单视图只会展示第一条匹配记录
- 如果ArrayList存储的元素量极大(超过1000个),可以换用第二种实现逻辑:在标准模块声明公共的ArrayList变量存储值,打开表单后在表单的
Load事件中遍历表单记录集,调用Contains方法过滤不符合的记录即可
内容的提问来源于stack exchange,提问作者jenshon
相关产品推荐
相关产品推荐

