当员工当前登录excel vba时禁用登录按钮

时间:2017-04-30 18:56:44

标签: excel vba login

使用vba userform的员工登录系统。 我可以捕获员工姓名和登录时间并将其放在工作表中。但是,当前登录的员工仍然可以登录系统。我想阻止它发生。

这是我表单的屏幕截图。

[enter image description here]

代码:

Dim CM As Boolean

Private Sub cmdLogin_Click()

With Worksheets("May_1st").Range("A65536").End(xlUp)
    .Offset(1, 0) = UserForm1.txtName.Value
    .Offset(1, 1) = UserForm1.txtEmpID.Value
    .Offset(1, 2) = UserForm1.txtTime.Value
End With

'Unload Me 'Optional: Close Userform1

txtName.Value = ""
txtEmpID.Value = ""
txtEmpID.SetFocus

End Sub

Private Sub cmdLogOut_Click()

'Worksheets("May_1st").Range("D65536").End(xlUp).Offset(1) = Format(Now, "hh:mm:ss")

'Unload Me 'Optional: Close Userform On Where Logout Button Is

Dim myLog As Worksheet
Dim myLogSheet As Range

Set myLog = Sheets("May_1st")
Set myLogSheet = myLog.Range("B:B").Find(txtEmpID.Value, , , xlWhole)

If Not myLogSheet Is Nothing Then
myLogSheet.Offset(0, 2) = Format(Now, "hh:mm:ss")

Else
txtName.Value = "XXX"

End If

txtName.Value = ""
txtEmpID.Value = ""
txtEmpID.SetFocus


End Sub

Private Sub txtEmpID_Change()

Dim mySheet As Worksheet
Dim myRange As Range

Set mySheet = Sheets("Emp_ID")
Set myRange = mySheet.Range("B:B").Find(txtEmpID.Value, , , xlWhole)

If Not myRange Is Nothing Then
txtName.Value = myRange.Offset(0, -1)
Else
txtName.Value = "Match not found"
End If

End Sub

Private Sub UserForm_activate()

'Do
'If CM = True Then Exit Sub
'txtTime = Format(Now, "hh:mm:ss")
'DoEvents
'Loop

Do While CM = False
UserForm1.txtTime = Format(Now, "hh:mm:ss")
DoEvents
Loop

'txtEmpID.SetFocus

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

CM = True

End Sub

2 个答案:

答案 0 :(得分:0)

解决此问题的方法有很多,但它们取决于了解登录表单的显示方式和时间。我会考虑解决这个问题:

  1. 为已登录的用户创建并维护一个标记

    • 这样可以使“登录”按钮变灰。当光标焦点超出Emp_ID时,代码将运行。虽然这可能在计算上很重,但这仅仅是代码实现的问题。
  2. 为登录和退出功能创建另一个表单

    • 您可以提示在当前表单中询问用户详细信息,并单击下一步按钮打开下一个表单,您可以验证用户是否应该登录或注销并为用户提供适当的选项

答案 1 :(得分:0)

您可以将登录详细信息存储到

  • 隐藏的表格
  • 范围名称
  • 注册表(sem_wait
  • // initialization of semaphore semaphore = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); sem_init(semaphore, 1, 0); 代码
  • 单独SaveSettings文件等

然后在代码中检索详细信息。

建议你挑选最适合自己的东西。