【问题标题】:Calculate Hours in factory by using Excel VBA使用 Excel VBA 计算工厂工时
【发布时间】:2021-05-06 14:07:01
【问题描述】:

单元格中有日期和进出工厂的时间。我想计算一下每个人来工厂的那天,他们呆了多少小时。

我编写了一个宏并将每个人定义为 sicil_no,因为它是唯一的数字。由于在同一日期有多个进入和退出,我需要计算每个日期和 sicil_no(人)首先计算进入和退出的数量,然后减去然后将它们相加以找到在工厂花费的总时间。

我的原始数据示例。

GECIS TARIHI SICIL NUMARASI SOYADI ADI GEÇİŞ YÖNÜ
04 03 2021 07:06:25 02491 JOHN CAN Entry
04 03 2021 09:28:01 02312 PLAT JULY Entry
04 03 2021 15:50:22 02312 PLAT JULY Exit
04 03 2021 17:08:48 02491 JOHN CAN Exit
08 03 2021 07:06:45 02312 PLAT JULY Entry
08 03 2021 07:53:37 02260 BABER YOKY Entry
08 03 2021 13:05:38 02312 PLAT JULY Exit
08 03 2021 13:18:30 02312 PLAT JULY Entry
08 03 2021 17:23:01 02312 PLAT JULY Exit
08 03 2021 19:37:36 02260 BABER YOKY Exit

Sub macro()

    Dim sicil_no As String
    Dim i As Integer
    Dim end_row As Long
    Dim dates As Range
    Dim gecis_yonu As String
    Dim entry As String
    Dim Exits As String
    
    end_row = Cells(Rows.Count, 3).End(xlUp).Row
    
    For i = 3 To end_row
        sicil_no = Cells(i, 3).Value
        dates = Cells(i, 1).Value
    
        If Range("J", i).Value = "Exit" Then
            Range("J", i).Value = exist
        End If
        
        If Range("J", i).Value = "Entry" Then
            Range("J", i).Value = entry
        End If
    Next
    
    For Each dates In Range("A", end_row)        
        Range("M", i).Value = exist - entry   
    Next
    
End Sub

【问题讨论】:

  • 请不要发布文件链接。而是将理解您的问题所需的所有内容都包含在问题本身中。如果你想展示一些东西,你可以添加截图。见How to Ask
  • 似乎一个 excel 公式可以轻松完成。 =24*(FirstOut-FirstIn+IF(SecondOut<>"",SecondOut-SecondIn,0)+IF(ThirdOut<>"",ThirdOut-ThirdIn,0)+IF(FourthOut<>"",FourthOut-FourthIn,0)) 解释:如果一个人没有休息,那么FirstOut就是他们在一天结束时离开。否则,这是他们第一次休息的开始。最后一个输出是他们回家,无论是第一个还是第四个输出。
  • @peh 我编辑了。我放了一个图片描述
  • @Toddleson 我应该如何定义第二个和其他变量?我应该自动填充下一个 6600 行吗?我在单元格上写了你的公式,但它给出了“名称”错误

标签: excel vba


【解决方案1】:

如果您的数据是一致的(并且每个人每天有一个 Entry 和一个 Exit),它应该使用以下公式计算一个人在工厂的总小时数(请参阅列D)

=(SUMIFS(A:A,C:C,C:C,J:J,"Exit")-SUMIFS(A:A,C:C,C:C,J:J,"Entry"))*24

=(SUMIFS(A:A,C:C,C:C,J:J,"Exit",A:A,">="&INT(A:A),A:A,"<"&INT(A:A)+1)-SUMIFS(A:A,C:C,C:C,J:J,"Entry",A:A,">="&INT(A:A),A:A,"<"&INT(A:A)+1))*24

您可以看到一个人每天在工厂工作了多少小时(见 E 栏)。


用你给出的例子来说明它是如何工作的:

  • F 栏(总小时数)
    =(SUMIFS(A:A,C:C,C:C,E:E,"Exit")-SUMIFS(A:A,C:C,C:C,E:E,"Entry"))*24
  • G 栏(每日营业时间)
    =(SUMIFS(A:A,C:C,C:C,E:E,"Exit",A:A,"&gt;="&amp;INT(A:A),A:A,"&lt;"&amp;INT(A:A)+1)-SUMIFS(A:A,C:C,C:C,E:E,"Entry",A:A,"&gt;="&amp;INT(A:A),A:A,"&lt;"&amp;INT(A:A)+1))*24
  • H 列(已更正的总小时数)
    =(SUMIFS(A:A,C:C,C:C,E:E,"Exit")-SUMIFS(A:A,C:C,C:C,E:E,"Entry")+IF(COUNTIFS(C:C,C:C,E:E,"Entry")&gt;COUNTIFS(C:C,C:C,E:E,"Exit"),MAXIFS(A:A,C:C,C:C,E:E,"Entry"),0))*24

请注意,如果有一个Entry 没有对应的Exit,这最终可能会发生。然后你需要从计算中删除最后一个Entry,才能正确计算。这是我尝试使用更正后的公式。

看到最后一个红色的Entry 没有Exit。 H 中的公式将从计算中删除 Entry

【讨论】:

  • 不,正如您在图片中看到的那样,一天中有多个条目,只有一个人。并且数据不一致,可能会出现一些异常,因为连续两次进入然后退出。例如入口-入口-出口-入口-出口。当我尝试时,上面的这个公式结果为 0
  • 这个公式每天可以处理多个进入和退出,正如您在我的示例(红色值)中看到的那样,02491 在一天2021-03-04 出现两次,并且计算正确。 • 确保您的日期是真实的数字日期,而不是看起来像日期的文本。您需要数字日期才能使用它进行计算。只要每个Entry 有一个Exit,这个公式就可以工作,如我的示例所示。
  • “可能会有一些例外,因为连续两次进入然后退出”请注意,一个人不能连续进入两次而不退出。这在物理上是不可能的。如果您有这样的错误数据,无论您要使用公式还是 VBA 脚本,都需要先将其消除。虚假数据需要剔除。
  • 我使用您的公式并将我的日期格式更改为您喜欢的 "DD.MM.YYYY HH:MM" 仍然看起来 0 我该怎么办?你的怎么样
  • 您需要从一小部分数据开始。不要使用你的全部数据,只使用一个样本,让它发挥作用。稍后您可以使用更多数据。确保在您的示例中每个Entry 都有一个Exit。只要它们是数字日期,日期格式就无关紧要。用这个论坛=VALUE(A2) 测试您是否有一个数字日期,其中A2 是您要测试的单元格。如果这个公式的结果是一个类似于44256,2961 的数字,那么如果它显示#VALUE! 为错误,那么它就是一个数字日期(这是完美的)你的日期不是日期而是文本(这意味着你不能用它们计算)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多