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")