我正在尝试编写VB代码,允许Access识别打开数据库的人的计算机ID,打开窗体并筛选分配给用户的记录。有谁知道如何做到这一点?如何使Access窗体自动打开用户数据?
回答
一个API to get the user name可能比使用Environ更好。如果名称在表中可用,则可以使用DLookUp获取ID,该ID可与the Where argument of the OpenForm method of the DoCmd object一起使用以打开过滤的列表。
如果您的计算机ID是您的意思,您可以使用Environ $(“ComputerName”)。这是我做到的一种快速和肮脏的方式。请注意,用户通常可以关闭表单的过滤器。 正如其他人所说,PC上的环境变量有可能被非管理员用户修改。
如果您担心用户将修改计算机的环境变量(例如,通过cmd设置COMPUTERNAME = MYBOSS),则可以使用Win32 API调用获取ComputerName值,如果您知道该用户是非 - 无法通过注册表或通过Windows修改计算机名的用户(见下文)。
与API
CAVEAT如果用户PC上的管理员权限,他们可以编辑HKLM注册表值,那么他们可以进行下面的注册表项:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
"ComputerName"="MyBossComputerName"
如果他们重新启动PC,Windows API调用将使用不正确的名称。然后,他们可以将注册表项设置恢复正常并重新启动PC。
在我的方案中,我有多个用户在同一台PC和Access数据库的不同日子工作。他们从PC上的共享文件夹位置打开数据库。当他们点击配电盘项目时,窗体打开窗体的Load事件运行。这种形式被绑定到一个名为USERNAME的列的表,它只是UserName的环境变量值(例如John.Smith)。
这里的VBA我把加载事件:
Private Sub Form_Load()
Dim currUser As String
DoCmd.Maximize
currUser = Environ$("USERNAME")
Me.Filter = "USERNAME = '" & currUser & "'"
Me.FilterOn = True
End Sub
API调用方案
如果您更愿意做一个API调用来获取计算机名称,而不是那么你可以做的如下:
API调用GetComputerName是由Ken Getz(VBA Developer's Handbook)或Dan Appleman(Visual Basic程序员指南的Win32 API)的代码派生而来的。 你也可以在互联网上找到它。首先将模块添加到您的项目中,将其重命名为 API或其他有意义的内容。然后插入下面的代码:
Private Declare Function GetComputerName Lib "kernel32" _
Alias "GetComputerNameA"(ByVal strBuffer As String, lngSize As Long) As Long
Public Function ComputerNameValue() As String
Dim strBuffer as String
Dim retValApi as Long
Dim bufferSize as Long
bufferSize = 256
strBuffer = Space(bufferSize)
'bufferSize will be returned with ComputerName length less null character.'
retValApi = GetComputerName(strBuffer, bufferSize)
If CBool(retValApi) Then
ComputerNameValue = Left$(strBuffer, bufferSize)
Else
'Your Error Handler'
End If
End Function
在窗体加载事件(修改为使用API包装函数,而不是Envrion $):
Private Sub Form_Load()
Dim PCName As String
DoCmd.Maximize
PCName = ComputerNameValue()
Me.Filter = "COMPUTERNAME = '" & PCName & "'"
Me.FilterOn = True
End Sub
'Environ $(”ComputerName“)'真的不是一个好主意,我可以通过打开命令提示符轻易地假装使用老板的电脑,键入'SET ComputerName = MyBossComputer',然后从同一个命令提示符运行Access。获取计算机名称的唯一可靠方法是通过@Remou的答案中引用的Windows API。 – 2010-11-21 21:39:46
我同意部分声明,我将修改代码snippet。如果工作场所没有锁定个人电脑和/或用户具有修改HKLM配置单元的权限,那么他们可以很容易地创建一个注册表项:[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ ComputerName \ ComputerName ]“ComputerName”=“MyBossComputer”重新启动操作系统打开Access窗体当代码将API Call调用到Kernel32 :: GetComputerNameA时它将在启动时读取这个注册表项所以API是reli只要用户不能修改PC上的HKLM配置单元即可。 – 2010-11-29 20:38:23
编辑会更改本地计算机的名称,如果它与同名计算机位于同一LAN上,则会导致某些名称空间冲突(这取决于如何完成名称解析 - 在管理员可能的情况下对用户的许可,这将是对等的,在这种情况下,NETBios广播可能会解决这个问题,这会导致错误)。但是,点了。 – 2010-11-30 00:45:03
- 1. Access 2000窗体 - 打开中心屏幕?
- 2. Access 2007 - Docmd.OpenForm无法打开窗体,OpenArgs?
- 3. 如何打开窗体?
- 4. 如何将自动填充“打开”一个使用jQuery和Rails的窗体?
- 5. 如何使用Delphi打开Access 97数据文件
- 6. 自动打开用户
- 7. 当VS2010中打开窗体时,TFS会自动检出一个窗体窗体
- 8. 使用用户窗体提取数据
- 9. 在新窗口中的Access中打开子窗体
- 10. 如何让用户控件打开新窗体?
- 11. 如何分别与用户打开多个聊天窗体,但是会阻止已经打开的窗体?
- 12. 如何在打开数据库时压缩MS Access数据库,使用vba
- 13. 如何使用VBA移动Access窗体的列表框?
- 14. 复制/替换/打开MS Access数据库作为用户
- 15. 通用打开窗体函数
- 16. 如何检查窗体是否有任何ShowDialog()窗体打开?
- 17. 如何阻止用户打开一个已打开的窗口?
- 18. 如何使用主MDI父窗体上的MenuList打开MDI子窗体
- 19. 在MS Access中打开Access时,如何使Web数据库可读?
- 20. 如何使页面加载时自动打开弹出窗口?
- 21. WORD VBA - 用户窗体 - 自动填充
- 22. 使用参数打开Microsoft Access
- 23. 如何从线程打开新窗体?
- 24. 如何打开第二个窗体?
- 25. 如何防止窗体多次打开
- 26. 如何强制Access在数据库打开时刷新引用
- 27. 从VB打开另一个用户正在使用的MS Access数据库
- 28. 从outlook链接打开窗体窗体?
- 29. 父窗体旁边的打开窗体
- 30. OpenArgs打开窗体中的子窗体?
什么你问当然是可能的,但你可能在巨大的问题上不会得到完整的答案。你为什么不尝试把你的项目分成更小的问题?例如,您的第一个问题可能是:“如何在Access中编写VBA代码来识别在打开数据库时正在使用的计算机?“将你的问题分解成更小的块可以帮助你更好地回答你的问题 – 2010-11-16 15:47:58