我有多个VBA表单,第一个表单从组合框中获取用户名并将其保存在全局变量中,代码如下:
Option Compare Database
Public emplID_global
Private Sub OKLogin_Click()
If Not IsNull(Me.Combo_emplID) Then
emplID_global = Me.Combo_emplID.Column(1)
DoCmd.Close
DoCmd.OpenForm "NavFrm", acNormal
End If
End Sub
现在在我的另一种形式中,我有一个组合框,我希望自动填充该变量的值,在加载表单时,我使用以前的表单保存,下面是代码:
Private Sub Form_Load()
Me.AdvName = emplID_global
Me.DataForm.Form.Recordset.MoveLast
End Sub
但它不起作用,它没有做任何事情。我希望以所有形式使用这种代码。
有人可以建议我的代码中有什么错误,我对VBA还不熟悉。在此先感谢:)
答案 0 :(得分:3)
为您的基础表添加一个字段,以供该特定记录的所有者使用。 (我刚才叫它Owner
。)
将以下代码添加到表单中:
Private Sub Form_BeforeInsert(Cancel As Integer)
Owner = Environ("username")
End Sub
Private Sub Form_Current()
Dim editable As Boolean
if nz(Owner,"")="" then
editable=true
else
editable = (Environ("username") = Owner)
End If
Form.AllowDeletions = editable
Form.AllowEdits = editable
End Sub
这是一个相当通用的解决方案。 Environ("username")
返回用户的Windows用户名。这不一定是所有 安全的。一个人可以转到命令提示符并编辑username
环境变量,以便它们看起来像是另一个人。这绝对不会不阻止NSA或其他任何具有一点计算机知识和恶意的人。但它将保持诚实的人诚实。
说明:
正在保存BeforeInsert
作为新记录运行。在这种情况下,它会将记录的Owner
字段设置为用户的Windows用户名。
每次显示新记录时,OnCurrent
部分都会运行。代码将检查当前Windows用户名是否与记录的Owner
字段中存储的用户名相匹配,并相应地设置表单AllowEdits
和AllowDeletions
标志。此外,如果Owner
字段为null
(与新记录相同),则editable
将设置为true
。如果你想真的强调用户不应该改变的事实,你也可以启用/禁用单个文本框......
TextBox1.Enabled=editable
ComboBox2.Enabled=editable
... etc.
简单的解决方案。让诚实的人不要覆盖彼此。工作。我经常使用这种方法。