我正在嘗試編寫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. 如何打開用戶窗體中的文件並使用打開的用戶窗體對其進行修改
- 2. C#Win窗體打開並編輯Access數據庫
- 3. Access 2007 - Docmd.OpenForm無法打開窗體,OpenArgs?
- 4. Access 2000窗體 - 打開中心屏幕?
- 5. 使用webpart打開窗體
- 6. 如何打開窗體?
- 7. 從MS Access打開PDF,使用VB.NET中的窗體形式
- 8. 在Access數據庫中輸入來自用戶的數據,同時打開它
- 9. 如何將自動填充「打開」一個使用jQuery和Rails的窗體?
- 10. 如何使用Delphi打開Access 97數據文件
- 11. 自動打開用戶
- 12. 當VS2010中打開窗體時,TFS會自動檢出一個窗體窗體
- 13. 如何從另一個窗體打開窗體中的窗體
- 14. 使用用戶窗體提取數據
- 15. Windows窗體打開新窗體以顯示數據
- 16. 在新窗口中的Access中打開子窗體
- 17. 用戶窗體打開工作表時打開
- 18. 如何讓用戶控件打開新窗體?
- 19. 如何分別與用戶打開多個聊天窗體,但是會阻止已經打開的窗體?
- 20. 如何使用C++ Builder使用按鈕打開新窗體?
- 21. 窗戶打開
- 22. 如何在打開數據庫時壓縮MS Access數據庫,使用vba
- 23. 如何使用VBA移動Access窗體的列表框?
- 24. 使用javascript在打開新窗體之前關閉所有打開的窗體
- 25. 複製/替換/打開MS Access數據庫作爲用戶
- 26. 通用打開窗體函數
- 27. 如何檢查窗體是否有任何ShowDialog()窗體打開?
- 28. 如何阻止用戶打開一個已打開的窗口?
- 29. 在MS Access中打開Access時,如何使Web數據庫可讀?
- 30. 如何使用主MDI父窗體上的MenuList打開MDI子窗體
什麼你問當然是可能的,但你可能在巨大的問題上不會得到完整的答案。你爲什麼不嘗試把你的項目分成更小的問題?例如,您的第一個問題可能是:「如何在Access中編寫VBA代碼來識別在打開數據庫時正在使用的計算機?「將你的問題分解成更小的塊可以幫助你更好地回答你的問題 – 2010-11-16 15:47:58