Access数据库:函数结果对比列表框值启动表单及错误438排查
嘿,我来帮你排查这个运行时错误438的问题——看了你的代码,问题主要出在列表框控件的引用方式上,还有几个小细节需要调整:
1. 错误根源:重复引用列表框控件
你已经把Forms!Users_Form!lst_Users赋值给了变量c,这意味着c本身就代表那个列表框控件。但后续循环里你又写了c.lst_Users.ListCount和c.lst_Users.Column(0, i),这就相当于在列表框对象里再找一个叫lst_Users的属性,而列表框根本没有这个属性,直接触发了“对象不支持该属性或方法”的438错误。
2. 修复后的完整代码
我帮你调整了代码逻辑,还加了几个优化点(比如找到匹配后提前退出循环、初始化验证状态),修复后的代码如下:
Function UserCompare() Dim c As Control Dim i As Integer Dim y As Boolean ' 打开用户列表表单(去掉括号更符合VBA常规写法) DoCmd.OpenForm "Users_Form" ' 直接引用列表框控件 Set c = Forms!Users_Form!lst_Users ' 初始化验证状态为未授权,避免未进入循环时y保持Empty状态 y = False ' 遍历列表框查找匹配的用户名 For i = 0 To c.ListCount - 1 If c.Column(0, i) = ThisUserName() Then y = True ' 找到匹配项后立即退出循环,提升运行效率 Exit For End If Next i ' 根据验证结果打开对应表单 If y = True Then DoCmd.OpenForm "Login Screen - Authorised" Else DoCmd.OpenForm "Login Screen - Unauthorised" End If ' 关闭用户列表表单,不保存更改 DoCmd.Close acForm, "Users_Form", acSaveNo End Function
3. 额外注意事项
- 请确保
ThisUserName()函数能正确返回从advapi32.dll获取的Windows用户名,如果这个函数本身有问题,也会导致验证逻辑失效。 - 建议给
Users_Form设置为弹出式且独占(在表单属性里调整),避免打开时被其他窗口遮挡,导致控件引用失败。
内容的提问来源于stack exchange,提问作者Chas_C
相关产品推荐
相关产品推荐

