|
- Sub xx()
- Dim arr, brr(), n&, i&, dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, j&
- With Sheet1
- n = .Cells(.Rows.Count, 1).End(xlUp).Row
- arr = .Range("C2:F" & n)
- On Error Resume Next
- For i = 1 To n - 1
- ReDim Preserve brr(1 To 3, 1 To i)
- If arr(i, 3) <> "" And arr(i, 4) <> "" Then
- If TimeValue(CDate(arr(i, 3))) <= TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("11:00:00") Then
- brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("7:30:00")) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) <= TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) <= TimeValue("12:00:00") Then
- brr(1, i) = 取值(3.5)
- ElseIf TimeValue(CDate(arr(i, 3))) <= TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("16:30:00") Then
- brr(1, i) = 取值(3.5 + (TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) <= TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("16:30:00") Then
- brr(1, i) = 取值(8)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("11:00:00") Then
- brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue(CDate(arr(i, 3)))) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) <= TimeValue("12:00:00") Then
- brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3)))) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("16:30:00") Then
- brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3))) + TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("7:30:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("11:00:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("16:30:00") Then
- brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3)))) * 24 + 4.5)
- ElseIf TimeValue(CDate(arr(i, 3))) >= TimeValue("11:00:00") And TimeValue(CDate(arr(i, 3))) <= TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("16:30:00") Then
- brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) >= TimeValue("11:00:00") And TimeValue(CDate(arr(i, 3))) <= TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("16:30:00") Then
- brr(1, i) = 取值(4.5)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("16:30:00") And TimeValue(CDate(arr(i, 4))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 4))) < TimeValue("16:30:00") Then
- brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue(CDate(arr(i, 3)))) * 24)
- ElseIf TimeValue(CDate(arr(i, 3))) > TimeValue("12:00:00") And TimeValue(CDate(arr(i, 3))) < TimeValue("16:30:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("16:30:00") Then
- brr(1, i) = 取值((TimeValue("16:30:00") - TimeValue(CDate(arr(i, 3)))) * 24)
- Else
- brr(1, i) = ""
- End If
-
- If TimeValue(CDate(arr(i, 4))) >= TimeValue("17:20:00") Then brr(2, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("17:00:00")) * 24)
- If brr(2, i) >= 3 Then brr(3, i) = 1
- End If
- Next
- .Range("H2").Resize(n - 1, 3) = Application.WorksheetFunction.Transpose(brr)
- [H1].Value = "白天工作小时数"
- [I1].Value = "晚上加班小时数"
- [J1].Value = "至二十点次数"
- '以下代码是根据E列F列计算出来的H列I列数据,生成一张每人一个月的总时间表格,放在N列开始
- n = .Cells(.Rows.Count, 1).End(xlUp).Row
- arr = .Range("a2:J" & n)
- Set dA = CreateObject("Scripting.Dictionary")
- Set dB = CreateObject("Scripting.Dictionary")
- Set dC = CreateObject("Scripting.Dictionary")
- Set dD = CreateObject("Scripting.Dictionary")
- Set dE = CreateObject("Scripting.Dictionary")
- Set dF = CreateObject("Scripting.Dictionary")
- Set dG = CreateObject("Scripting.Dictionary")
- Set dH = CreateObject("Scripting.Dictionary")
- Set dI = CreateObject("Scripting.Dictionary")
- Set dJ = CreateObject("Scripting.Dictionary")
- For i = 1 To n - 1
- If Weekday(arr(i, 2), 2) < 6 Then
- If dA.Exists(arr(i, 1)) Then
- dA(arr(i, 1)) = dA(arr(i, 1)) + arr(i, 8)
- dB(arr(i, 1)) = dB(arr(i, 1)) + arr(i, 9)
- dC(arr(i, 1)) = dC(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
- Else
- dA.Add arr(i, 1), arr(i, 8)
- dB.Add arr(i, 1), arr(i, 9)
- dC.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
- End If
- ElseIf Weekday(arr(i, 2), 2) = 6 Then
- If dA.Exists(arr(i, 1)) Then
- dD(arr(i, 1)) = dD(arr(i, 1)) + arr(i, 8)
- dE(arr(i, 1)) = dE(arr(i, 1)) + arr(i, 9)
- dF(arr(i, 1)) = dF(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
- Else
- dD.Add arr(i, 1), arr(i, 8)
- dE.Add arr(i, 1), arr(i, 9)
- dF.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
- End If
- ElseIf Weekday(arr(i, 2), 2) = 7 Then
- If dA.Exists(arr(i, 1)) Then
- dG(arr(i, 1)) = dG(arr(i, 1)) + arr(i, 8)
- dH(arr(i, 1)) = dH(arr(i, 1)) + arr(i, 9)
- dI(arr(i, 1)) = dI(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
- Else
- dG.Add arr(i, 1), arr(i, 8)
- dH.Add arr(i, 1), arr(i, 9)
- dI.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
- End If
- End If
- dJ.Add arr(i, 1), arr(i, 7)
- Next
- x = 1
- For Each k In dA.keys
- x = x + 1
- .Cells(x, 14) = k
- .Cells(x, 15) = dA(k)
- .Cells(x, 16) = dB(k)
- .Cells(x, 17) = dC(k)
- .Cells(x, 18) = dD(k)
- .Cells(x, 19) = dE(k)
- .Cells(x, 20) = dF(k)
- .Cells(x, 21) = dG(k)
- .Cells(x, 22) = dH(k)
- .Cells(x, 23) = dI(k)
- .Cells(x, 24) = dJ(k)
- Next
- [N1].Value = "姓名"
- [O1].Value = "正常出勤时间"
- [P1].Value = "加点时间"
- [Q1].Value = "加点次数"
- [R1].Value = "周六白天"
- [S1].Value = "周六晚上"
- [T1].Value = "周六加点次数"
- [U1].Value = "周日白天"
- [V1].Value = "周日晚上"
- [W1].Value = "周日加点次数"
- [X1].Value = "部门"
- '以下代码是为E列F列有空白格的行涂上黄色
- [a:j].Interior.ColorIndex = xlNone
- For i = 2 To [e:f].Find("*", searchdirection:=xlPrevious).Row
- If Cells(i, 5) <> "" And Cells(i, 6) = "" Or Cells(i, 6) <> "" And Cells(i, 5) = "" Then
- Cells(i, 1).Resize(1, 10).Interior.ColorIndex = 6
- End If
- Next
- End With
-
- End Sub
- Function 取值(ByVal x As Double) As Double
- If x - Int(x) > 0.83333 Then
- 取值 = Round(x, 0)
- ElseIf x - Int(x) < 0.33333 Then
- 取值 = Int(x)
- Else
- 取值 = Int(x) + 0.5
- End If
- End Function
复制代码 按“雪舞子”的方法帮你修改了一下,运行后完全没有错误了: |
|