如何在私有模块中创建公共变量?Access登录表单ID跨表单调用报错求助
问题一:如何在私有模块中创建公共变量?
首先得明确你说的「私有模块」具体是哪种场景:
- 如果是表单/报表这类类模块(它们默认是私有作用域的模块),要创建公共变量超简单——直接在模块的通用声明段用
Public关键字声明就行,比如:
但要注意:这种变量是依附于表单实例的,只有当表单处于打开状态时,你才能通过表单名称访问它,比如Option Compare Database Option Explicit ' 这个变量属于当前表单实例,只要表单打开就能访问 Public MyPublicVar As StringForms!你的表单名.MyPublicVar;表单一关,变量就跟着销毁了。 - 如果是标准模块(就是你插入的普通模块),要是想让变量只在这个模块内部能用,就用
Private声明(这才是标准模块里的「私有变量」);要是想让变量全局可用,还是用Public声明就行。
问题二:登录表单保存ID后,其他表单调用出错的问题
看你的代码,核心问题出在你把登录表单关闭了!你在登录成功后执行了 DoCmd.Close acForm, Me.Name,这会直接销毁登录表单的实例——而你声明的 Public ID_ As String 是属于这个表单实例的变量,表单一关,这个变量就不存在了,其他表单自然调用不到。
给你几个实用的解决办法,按推荐程度排序:
方法1:用全局变量(标准模块)
创建一个新的标准模块(菜单栏选「插入」→「模块」),在里面声明全局变量:
Option Compare Database Option Explicit ' 全局存储登录用户ID,整个数据库都能访问 Public g_LoginUserID As String
然后回到登录表单的代码,把ID赋值给这个全局变量,不用管登录表单关不关闭:
Private Sub Command4_Click() Dim strCBOPass As String Dim strPassword As String strCBOPass = Me.CBOUsername.Column(1) strPassword = Me.txtpassword If strCBOPass = strPassword Then MsgBox "Login Successful!" ' 把选中的用户ID赋值给全局变量 g_LoginUserID = Me.CBOUsername.Column(0) DoCmd.OpenForm "Form1" DoCmd.Close acForm, Me.Name Else MsgBox "用户名或密码错误!" End If End Sub
之后在Form1里直接用 g_LoginUserID 就能拿到这个ID了。
方法2:打开Form1时直接传递ID参数
不用依赖变量,直接在打开Form1的时候把ID传过去,这种方法更安全,不会有全局变量的污染问题:
修改登录表单里打开Form1的代码:
' 最后一个参数就是要传递的ID DoCmd.OpenForm "Form1", , , , , acDialog, Me.CBOUsername.Column(0)
然后在Form1的 Form_Load 事件里接收这个参数:
Private Sub Form_Load() Dim loginID As String ' 获取传递过来的ID参数 loginID = Me.OpenArgs ' 这里就可以用这个ID做你需要的操作了,比如显示或者存起来 MsgBox "当前登录用户ID:" & loginID End Sub
方法3:隐藏登录表单(不推荐)
要是你坚持想用表单的公共变量,可以把关闭表单改成隐藏:
' 把DoCmd.Close换成Me.Hide Me.Hide DoCmd.OpenForm "Form1"
之后在Form1里通过 Forms!你的登录表单名称.ID_ 来访问这个变量。但这种方法不太好,因为登录表单会一直留在内存里,容易出现意外问题,不推荐。
另外还要检查下你的代码里 ID_ = Me.CBOUsername.Column... 是不是没写完?记得要完整写成 ID_ = Me.CBOUsername.Column(0) 哦,这个小细节别漏了。
内容的提问来源于stack exchange,提问作者Billy
相关产品推荐
相关产品推荐

