Excel VBA每月计时

时间:2017-04-18 04:06:32

标签: excel vba excel-vba

我正在尝试创建一个共享的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列中。

问题:“时间存储”工作表中的数据似乎没有水平显示在一行中。相反,它以向下的对角线模式出现。)

编辑:分享屏幕截图:

“时间输入”表

"Time Entry" Sheet

“时间表”存储

"Time Sheet" Storage

1 个答案:

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