我正在尝试创建一个共享的Excel时间表,供大约30名员工用于日常计时。
此计时表将记录员工的日常时间戳:
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.
我创建了一个表单界面,特定员工可以勾选CheckBox
来记录他/她的时间戳:
Time-In,Time-Out,1st break开始,1st break结束等等。然后将时间戳转发到Sheet2中的一个表,该表捕获当天该员工的所有时间戳。
我的问题是:当员工第二天重新开始工作时,前一天的所有时间戳都会被当天的时间戳覆盖。
专家给了我一个示例代码,但“时间存储”表中的数据似乎没有水平显示在一行中。相反,它以向下的对角线模式出现。
如果你能以任何方式帮助我,我们将不胜感激。
以下是示例代码:
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
(我将时间戳输入到名为“时间输入”的工作表的单元格“B4:B12”中,然后将它们存储到名为“时间存储”的工作表的B到M列中。
问题:“时间存储”工作表中的数据似乎没有水平显示在一行中。相反,它以向下的对角线模式出现。)
编辑:分享屏幕截图:
答案 0 :(得分:0)
如果您包含屏幕截图,则会更容易诊断。我假设时间存储中的每一行仍然在A列中有一个日期,其余的列是对角填充的。
代码在Worksheet_Change事件上运行,这意味着每次更改任何单元格时它都会运行。更改的每个单元格都会导致所有代码运行,一次只添加一个额外的行,只有一个值。
您应该只希望代码在最后一个单元格更新时运行一次。假设您按顺序填充单元格,代码应该只在目标范围与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")