如何从Access VBA中的另一个私有子项中获取在私有子项中声明的变量的值

时间:2018-12-22 13:59:46

标签: ms-access access-vba

我正在使用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函数有效

5 个答案:

答案 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属性中,以避免产生歧义