我正在使用Microsoft Access 2013,在VBA中工作时遇到此问题。 是否可以将在私有子集中声明或定义的变量的值传递给全局变量? 我尝试了不同的方法...但是没有办法
首先,我在使用它的私有子对象中定义并声明了该变量。 接下来,我将变量定义为公共变量,然后在该私有子集中定义它,但是当我尝试将其值传递给全局变量时,它返回null。我不知道是否是因为它在条件语句中。
Option Compare Database
Public recUserID As Long
Option Explicit
Private Sub txtPassword_AfterUpdate()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM tblUser")
'Check that user is selected/entered
If IsNull(Me.txtUser) Then
MsgBox "Select User"
Else
rs.FindFirst "[PersonnelID] = '" & Me.txtUser & "'"
If rs.NoMatch Then
MsgBox "User does not exist, please enter correct ID"
Else
recUserID = rs![UserID]
End If
End If
End Sub
Private Sub Form_AfterUpdate()
gblStudent = recUserID
End Sub
应该将变量“ recUserID”的值(即记录的ID)传递给全局变量“ gblStudent”,但是在调试时,“表单更新后”的变量将返回0 >
注意:表单已绑定到表,因此AfterUpdate函数有效
答案 0 :(得分:0)
您甚至确定事件已触发吗? Form_AfterUpdate()
在其中放置一个消息框以进行检查。
btw;我了解您的目标-由于调试方面的挑战,我本人已经脱离了这种方法...相反,我的应用程序始终具有始终打开的“开始”屏幕--在这里我放置未绑定的文本框,其作用与成为全球性公司...但是我可以在开发过程中使它们可见,以便轻松查看其价值。如果适合您的项目,请记住一些事情。
答案 1 :(得分:0)
首先,请阅读有关断点和Debug.Print
的信息:Debugging VBA Code
Form_AfterUpdate()
。
登录表单通常是未绑定,即它没有记录源。因此,您的函数将永远不会执行。您需要为此找到其他事件。
答案 2 :(得分:0)
许多开发人员都不喜欢全局变量,但是它们通常在Access开发中被证明是有用的。我的建议是永远不要在模块中使用“裸全局”。而是使用公共属性:
__new__
通过这种方式,您的代码可以像以前一样工作,但是您可以在属性中放置断点,以查看何时或是否被设置或读取。
答案 3 :(得分:0)
当您继续调用“变量”而不指定要谈论的变量时,很难解析您的问题。据我所知,您说的是在问题开始时recUserID返回“ Null”,但是随后您还说它正在返回“ 0”,在这种情况下,结果将大不相同。无论如何,我的印象是recUserID要么设置不正确,要么在您引用它时不再正确。
要在我自己的代码中进行故障排除,我将从Cahaba Data建议的内容开始;添加一些消息框:
If IsNull(Me.txtUser) Then
MsgBox "Select User"
Else
rs.FindFirst "[PersonnelID] = '" & Me.txtUser & "'"
If rs.NoMatch Then
MsgBox "User does not exist, please enter correct ID"
Else
recUserID = rs![UserID]
MsgBox (recUserID) 'Add here
End If
End If
End Sub
Private Sub Form_AfterUpdate()
MsgBox (recUserID) 'Add here
gblStudent = recUserID
MsgBox (gblStudent) 'Add here
End Sub
理想情况下,您应该看到所有3个带有所需ID的消息框。第一个错误的位置将帮助您告诉问题出在哪里。
答案 4 :(得分:0)
我通过从数据库中的记录集中调用该值,然后将该值传递给所需的全局变量来解决了这个问题
Dim state As DAO.Recordset
Set state = CurrentDb.OpenRecordset("select * from tblStudent")
state.FindFirst "[MatriculationNumber] = '" & Me.txtUser & "'"
gblStudent = state![StudentID]
但是我将这段代码放在表单(txtPassword)上控件的AfterUpdate属性中,以避免产生歧义