Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA每月计时_Vba_Excel - Fatal编程技术网

Excel VBA每月计时

Excel VBA每月计时,vba,excel,Vba,Excel,我正在尝试创建一个共享的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

我正在尝试创建一个共享的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. 
我创建了一个表单界面,特定员工可以在其中勾选一个
复选框
,以记录他/她的时间戳:

进入时间、退出时间、第一次休息开始时间、第一次休息结束时间等。。然后将时间戳转发到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
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim rngC As范围
暗lngR与长lngR一样
将shtS变暗为工作表
设置shtS=工作表(“时间存储”)
如果Intersect(目标,范围(“B4:B12”))为空,则退出Sub
lngR=shtS.Cells(shtS.Rows.Count,“A”).End(xlUp).Row
如果短单元格(lngR,“A”)。结束(xlUp)。生效日期,则
lngR=shtS.Cells(shtS.Rows.Count,“A”)。End(xlUp)。Row+1
短单元格(lngR,“A”)。值=日期
如果结束
对于Intersect中的每个rngC(目标,范围(“B4:B12”))
如果rngC.Value为“”,则
单元格(lngR,rngC.Row-2).Value=Target.Value
如果结束
下一个rngC
端接头
(我将时间戳输入到名为“时间输入”的工作表的单元格“B4:B12”中,并将其存储到名为“时间存储”的工作表的B列到M列中

问题在于:“时间存储”表中的数据似乎不是水平显示在一行中,而是以向下的对角线模式显示。)

编辑:共享屏幕截图:

“时间记录”表

“时间表”存储

如果包含屏幕截图,诊断起来会更容易。我假设时间存储器中的每一行在a列中仍然有一个日期,其余的列都是对角填充的

代码在工作表_Change事件上运行,这意味着它在每次更改任何单元格时都会运行。每个被更改的单元格都会导致所有代码运行,每次只添加一行额外的值

当最后一个单元格更新时,您应该只希望代码在最后运行一次。假设您按顺序填充单元格,则当目标范围与B12相交时,代码只应运行一次。所以这张支票:

If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub
应该是:

If Intersect(Target, Range("B12")) Is Nothing Then Exit Sub
然后循环应该贯穿所有单元格。因此,rngC应声明为单元格,而不是范围和循环:

For Each rngC In Intersect(Target, Range("B4:B12"))
实际上应该是:

For Each rngC In Range("B4:B12")

如果包含一个屏幕截图,诊断起来会更容易。我假设时间存储器中的每一行在a列中仍然有一个日期,其余的列都是对角填充的

代码在工作表_Change事件上运行,这意味着它在每次更改任何单元格时都会运行。每个被更改的单元格都会导致所有代码运行,每次只添加一行额外的值

当最后一个单元格更新时,您应该只希望代码在最后运行一次。假设您按顺序填充单元格,则当目标范围与B12相交时,代码只应运行一次。所以这张支票:

If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub
应该是:

If Intersect(Target, Range("B12")) Is Nothing Then Exit Sub
然后循环应该贯穿所有单元格。因此,rngC应声明为单元格,而不是范围和循环:

For Each rngC In Intersect(Target, Range("B4:B12"))
实际上应该是:

For Each rngC In Range("B4:B12")

您应该为您的工作表添加数据样本“时间输入”和“时间存储”-您想要达到的结果(甚至手动制作),我不会使用
工作表\u Change
事件,而是通过按钮或其他方式调用的子项。我明白您的意思。我想这里之所以使用工作表更改事件,是因为我们正在尝试将其自动化(这样我们就不再需要在每次创建时间戳时单击任何按钮)。但我明白你的意思。我非常感谢您的反馈。问题是您不能在单个单元格事件上运行代码,让我们假设他在
范围(“B6”)
中写入新数据,您想在“时间存储”表上创建新记录吗?那么,当他更新“B7”中的值时,现在该怎么办?
日期
已经相同,您不需要;不要更新记录,明白我的意思吗?我也考虑过。虽然我认为,新数据(所有新的更改)可能可以用作审计跟踪(反映在单独的工作表上),因此我们可以跟踪员工尝试为每个时段(休息、午餐等)创建时间戳的次数。然后我们可以创建另一张表格,只显示员工为每个期间输入的最终/最后时间戳。但不确定这是否可行。您应该为您的工作表添加数据样本“时间输入”和“时间存储”-期望的结果(甚至手动实现)以实现您想要实现的目标。我不会使用
工作表\u Change
事件,而是通过按钮或其他方式调用的子项。我明白您的意思。我想这里之所以使用工作表更改事件,是因为我们正在尝试将其自动化(这样我们就不再需要在每次创建时间戳时单击任何按钮)。但我明白你的意思。我非常感谢您的反馈。问题是您不能在单个单元格事件上运行代码,让我们假设他在
范围(“B6”)
中写入新数据,您想在“时间存储”表上创建新记录吗?那么,当他更新“B7”中的值时,现在该怎么办?
日期
已经相同,您不需要;不要更新记录,明白我的意思吗?我也想过