如果这就是您所说的 ComputerID,您可以使用 Environ$("ComputerName")。这是我做到的一种快速而肮脏的方式。请注意,用户通常可以关闭表单的过滤器。
正如其他人所说,PC 上的环境变量有可能被非管理员用户修改。
如果您担心用户会修改计算机的环境变量(即通过 cmd 设置 COMPUTERNAME=MYBOSS),如果您知道用户不是无法通过注册表或 Windows 修改计算机名的管理员用户(见下文)。
使用 API 的警告
如果用户在 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 调用来获取 ComputerName,那么您可以执行以下操作:
API 调用 GetComputerName 是从 Ken Getz(VBA 开发人员手册)或 Dan Appleman(Visual Basic Programmer's Guide to the 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