Excel VBA每月计时
我正在尝试创build一个共享的Excel时间表,供大约30名员工用于日常计时。
这张计时表将logging员工每天的时间戳:
Start of Pre-shift OverTime, End of Pre-shift Overtime, Time-In, Time-Out, Start of 1st break, End of 1st break, Start of Lunch, End of Lunch, Start of 2nd break, End of 2nd break, Start of Post-shift OverTime, End of Post-shift Overtime, Etc.
我创build了一个表单界面,其中特定的员工可以勾选CheckBox
来logging他/她的时间戳:
Time-In,Time-Out,第一次rest开始,第一次rest结束等。时间戳然后被转发到Sheet2中的表格,该表格捕获该雇员当天的所有时间戳。
我的问题是 :当员工第二天回来工作时,前一天的所有时间戳将被当前时间的时间戳覆盖。
一位专家给了我一个示例代码,但“时间存储”表中的数据似乎并不出现在一行中。 相反,它出现在一个向下的对angular线模式。
如果你能以任何方式帮助我,我将非常感激。
以下是示例代码:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim rngC As Range Dim lngR As Long Dim shtS As Worksheet Set shtS = Worksheets("Time Storage") If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub lngR = shtS.Cells(shtS.Rows.Count, "A").End(xlUp).Row If shtS.Cells(lngR, "A").End(xlUp).Value <> Date Then lngR = shtS.Cells(shtS.Rows.Count, "A").End(xlUp).Row + 1 shtS.Cells(lngR, "A").Value = Date End If For Each rngC In Intersect(Target, Range("B4:B12")) If rngC.Value <> "" Then shtS.Cells(lngR, rngC.Row - 2).Value = Target.Value End If Next rngC End Sub
(我将时间戳记input名为“时间input”的纸张的单元格“B4:B12”中,并将它们存储在名为“时间存储”的纸张的B列至M列中。
问题是 :“时间存储”表中的数据似乎不在一行中水平显示。 相反,它出现在一个向下的对angular线模式。)
编辑:共享屏幕截图:
“时间input”表
“时间存储”表
如果包含屏幕截图,将会更容易诊断。 我假设时间存储中的每一行在列A中都有一个date,其余的列是对angular线填充的。
该代码在Worksheet_Change事件上运行,这意味着每次更改任何单元格时都会运行该代码。 每个被更改的单元格都会导致所有代码都运行,每次只添加一个值,只有一个值。
最后一个单元格更新时,您应该只希望代码运行一次。 假设您按顺序填充单元格,则代码只应在Target范围与B12相交时运行一次。 所以这个检查:
If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub
应该:
If Intersect(Target, Range("B12")) Is Nothing Then Exit Sub
然后循环应该贯穿所有单元格。 所以rngC应该声明为Cell而不是Range和循环:
For Each rngC In Intersect(Target, Range("B4:B12"))
实际上应该是:
For Each rngC In Range("B4:B12")