во-первых, я рекомендую использовать имена диапазонов для важных ячеек вашего листа
D6 EmpName
D7 EmpNo
D10 ClockInTime
D11 ClockOutTime
H5..H11 DataTable
Это позволит вам ссылаться на них по имени вместо жесткого кодирования их адресов (плохое плохое жесткое кодирование: - /)
Во-вторых, ваша [Кнопка] должна служить двойному назначению ... она должна решить, будет ли пользователь включен или выключен и делать разные вещи
высокоуровневый МЕТА-код, выполняемый при нажатии[Button4] может быть
if user clocked in
write current time into ClockOutTime ' remark: this may be superfluous
find DataTable record (EmpName, ClockInTime)
write ClockOutTime into record (EmpName, ClockInTime)
erase EmpName, EmpID, ClockInTime, ClockOutTime
else
write current time into ClockInTime
find first blank record in DataTable
write EmpName, EmpID, ClockInTime into DataTable record
endif
Как определить, включен ли пользователь?Если многие пользователи используют один и тот же лист в одно и то же время (то есть туда входят 5 emp, напишите их имена и часы), вам нужно проверить DataTable для первой записи EmpNane без ClockOutTime - если он найден, он / она находится инужно отключить.
позже ...
ОК ... извините, что был прерван концертом Lady Gaga в Вене / AT
, так что вот полный кодкнопка
Sub ButtonPressed()
Dim DB As Range, Idx As Integer
Set DB = Range("DataTable")
If Range("EmpName") = "" Or Range("EmpNo") = "" Then
MsgBox "Enter your name and ID before pressing the button", vbCritical + vbOKOnly, "missing input"
Exit Sub
End If
Idx = UserClockedIn()
If Idx <> 0 Then
DB(Idx, 4) = Date + Time()
DB(Idx, 5).Formula = "=" & DB(Idx, 4).Address(RowAbsolute:=False, ColumnAbsolute:=False) & "-" & DB(Idx, 3).Address(RowAbsolute:=False, ColumnAbsolute:=False)
DB(Idx, 5).NumberFormat = "[hh]:mm"
Range("EmpName") = ""
Range("EmpNo") = ""
Else
Idx = 2
Do While DB(Idx, 1) <> ""
Idx = Idx + 1
Loop
DB(Idx, 1) = Range("EmpName")
DB(Idx, 2) = Range("EmpNo")
DB(Idx, 3) = Date + Time()
End If
End Sub
Private Function UserClockedIn() As Integer
Dim DB As Range, Idx As Integer
Set DB = Range("DataTable")
UserClockedIn = 0
Idx = 2
Do While DB(Idx, 1) <> ""
If DB(Idx, 1) = Range("EmpName") And DB(Idx, 2) = Range("EmpNo") And DB(Idx, 4) = "" Then
UserClockedIn = Idx
Exit Function
End If
Idx = Idx + 1
Loop
End Function
@ user502908: Я не задокументировал это, потому что хочу, чтобы вы точно выяснили, что он делает, и тем самым быстро приступил к работе с Excel-VBA :-) Это тоже не сработаетмного и есть некоторые основные приемы, которые вы будете применять снова и снова, если зайдете в VBA ... попробуйте заполнить диапазоны "ClockInTime" и "ClockOutTime": -)))
Book1ssNew.xlsm
веселиться