Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2554|回复: 6

[已解决]修改时间数据后 好像单元格属性发生变化了,再跑一遍代码 计算出不同结果该怎么办

[复制链接]
发表于 2016-7-2 14:07 | 显示全部楼层 |阅读模式
本帖最后由 mathking77 于 2016-7-3 18:03 编辑

E列和F列是表示时间的数据,
我用代码跑完后 计算出来差值 结果显示在H列,运行代码算出来的结果是正确的 没有问题。

但如果我修改下E列或者F列的时间,计算出来的结果会发生错误,有的直接计算不出结果了
比如 7:20 我还是改成7:20, 再运行一遍代码, 发现计算出来的结果和之前的不一样了,同样的7:20,结果却不同了

我如果直接复制其他行的时间过去 计算出来也是对的,所以说复制其他格时间是不会发生错误的,只有手工修改了时间会发生错误,
所以我觉得是改完时间后的格子属性发生了变化,没有修改的时候 时间数据是显示XX:XX, 一修改就会变成XX:XX:XX

求大神指点下 ,应该怎么解决这个问题,
需要修改完时间数据后 再运行代码 算出来也要是正确的


最佳答案
2016-7-3 18:37
代码太长,不了解你的意图,所以无从分析和修改。

初步看了一下你的表格,好像数据是从哪导出来的,
几列时间数据格式不一致
C列数据为自定义时间格式,其他几列时间数据是文本格式,
代码中用了 TimeValue() 函数去转换和比较时间,
TimeValue() 函数参数要求是文本格式,
因此在比较和计算C列时间数据时会出现错误,
同样道理,你更改了其他列的时间数据,
excel会自动将原来的文本格式转换成自定义的时间格式,
这样经过TimeValue()函数转换后自然也会出现错误或结果不正确。

原代码作者使用On Error Resume Next
略过了大量“类型不正确”错误以及其他错误,
因此结果有差异在所难免,
最好找原代码编写者重新优化一下代码。

初步给你个建议:
将代码中所有TimeValue()函数用CDate()替换一下,
测试一下结果是不是能达到你的要求。

样件.rar

29.04 KB, 下载次数: 31

 楼主| 发表于 2016-7-2 18:32 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2016-7-3 11:28 | 显示全部楼层
本帖最后由 mathking77 于 2016-7-3 17:28 编辑

求大神解答下
回复

使用道具 举报

 楼主| 发表于 2016-7-3 17:28 | 显示全部楼层
回复

使用道具 举报

发表于 2016-7-3 18:37 | 显示全部楼层    本楼为最佳答案   
代码太长,不了解你的意图,所以无从分析和修改。

初步看了一下你的表格,好像数据是从哪导出来的,
几列时间数据格式不一致
C列数据为自定义时间格式,其他几列时间数据是文本格式,
代码中用了 TimeValue() 函数去转换和比较时间,
TimeValue() 函数参数要求是文本格式,
因此在比较和计算C列时间数据时会出现错误,
同样道理,你更改了其他列的时间数据,
excel会自动将原来的文本格式转换成自定义的时间格式,
这样经过TimeValue()函数转换后自然也会出现错误或结果不正确。

原代码作者使用On Error Resume Next
略过了大量“类型不正确”错误以及其他错误,
因此结果有差异在所难免,
最好找原代码编写者重新优化一下代码。

初步给你个建议:
将代码中所有TimeValue()函数用CDate()替换一下,
测试一下结果是不是能达到你的要求。
回复

使用道具 举报

 楼主| 发表于 2016-7-3 19:17 | 显示全部楼层
本帖最后由 mathking77 于 2016-7-3 19:32 编辑
雪舞子 发表于 2016-7-3 18:37
代码太长,不了解你的意图,所以无从分析和修改。

初步看了一下你的表格,好像数据是从哪导出来的,

因为数据表格是从打卡软件直接导出来的 所以最初就是文本格式   我之后修改完就自动变成自定义格式的话 如果我在代码中加上一句 把EF两列所有单元格设置成文本格式 那就不用改掉timevalue()了吧 因为计算只用到了E-F的数据 C-D列的数据是不需要的
请问把EF列设置成文本格式的代码是什么? 我加进去就行了
回复

使用道具 举报

发表于 2016-7-3 20:04 | 显示全部楼层
  1. Sub xx()

  2.     Dim arr, brr(), n&, i&, dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, j&
  3.     With Sheet1
  4.         n = .Cells(.Rows.Count, 1).End(xlUp).Row
  5.         arr = .Range("C2:F" & n)
  6.         On Error Resume Next
  7.         For i = 1 To n - 1
  8.             ReDim Preserve brr(1 To 3, 1 To i)
  9.             If arr(i, 3) <> "" And arr(i, 4) <> "" Then
  10.                     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
  11.                            brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("7:30:00")) * 24)
  12.                     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
  13.                            brr(1, i) = 取值(3.5)
  14.                     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
  15.                            brr(1, i) = 取值(3.5 + (TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
  16.                     ElseIf TimeValue(CDate(arr(i, 3))) <= TimeValue("7:30:00") And TimeValue(CDate(arr(i, 4))) >= TimeValue("16:30:00") Then
  17.                            brr(1, i) = 取值(8)
  18.                     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
  19.                            brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue(CDate(arr(i, 3)))) * 24)
  20.                     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
  21.                            brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3)))) * 24)
  22.                     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
  23.                            brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3))) + TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
  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
  25.                            brr(1, i) = 取值((TimeValue("11:00:00") - TimeValue(CDate(arr(i, 3)))) * 24 + 4.5)
  26.                     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
  27.                            brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("12:00:00")) * 24)
  28.                     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
  29.                            brr(1, i) = 取值(4.5)
  30.                     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
  31.                            brr(1, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue(CDate(arr(i, 3)))) * 24)
  32.                     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
  33.                            brr(1, i) = 取值((TimeValue("16:30:00") - TimeValue(CDate(arr(i, 3)))) * 24)

  34.                     Else
  35.                            brr(1, i) = ""
  36.                     End If
  37.                               
  38.                 If TimeValue(CDate(arr(i, 4))) >= TimeValue("17:20:00") Then brr(2, i) = 取值((TimeValue(CDate(arr(i, 4))) - TimeValue("17:00:00")) * 24)
  39.                 If brr(2, i) >= 3 Then brr(3, i) = 1

  40.           End If

  41.         Next
  42.         .Range("H2").Resize(n - 1, 3) = Application.WorksheetFunction.Transpose(brr)
  43.        [H1].Value = "白天工作小时数"
  44.        [I1].Value = "晚上加班小时数"
  45.        [J1].Value = "至二十点次数"



  46.         '以下代码是根据E列F列计算出来的H列I列数据,生成一张每人一个月的总时间表格,放在N列开始
  47.         n = .Cells(.Rows.Count, 1).End(xlUp).Row
  48.         arr = .Range("a2:J" & n)
  49.         Set dA = CreateObject("Scripting.Dictionary")
  50.         Set dB = CreateObject("Scripting.Dictionary")
  51.         Set dC = CreateObject("Scripting.Dictionary")
  52.         Set dD = CreateObject("Scripting.Dictionary")
  53.         Set dE = CreateObject("Scripting.Dictionary")
  54.         Set dF = CreateObject("Scripting.Dictionary")
  55.         Set dG = CreateObject("Scripting.Dictionary")
  56.         Set dH = CreateObject("Scripting.Dictionary")
  57.         Set dI = CreateObject("Scripting.Dictionary")
  58.         Set dJ = CreateObject("Scripting.Dictionary")
  59.         For i = 1 To n - 1
  60.             If Weekday(arr(i, 2), 2) < 6 Then
  61.                 If dA.Exists(arr(i, 1)) Then
  62.                     dA(arr(i, 1)) = dA(arr(i, 1)) + arr(i, 8)
  63.                     dB(arr(i, 1)) = dB(arr(i, 1)) + arr(i, 9)
  64.                     dC(arr(i, 1)) = dC(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
  65.                 Else
  66.                     dA.Add arr(i, 1), arr(i, 8)
  67.                     dB.Add arr(i, 1), arr(i, 9)
  68.                     dC.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
  69.                 End If
  70.             ElseIf Weekday(arr(i, 2), 2) = 6 Then
  71.                 If dA.Exists(arr(i, 1)) Then
  72.                     dD(arr(i, 1)) = dD(arr(i, 1)) + arr(i, 8)
  73.                     dE(arr(i, 1)) = dE(arr(i, 1)) + arr(i, 9)
  74.                     dF(arr(i, 1)) = dF(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
  75.                 Else
  76.                     dD.Add arr(i, 1), arr(i, 8)
  77.                     dE.Add arr(i, 1), arr(i, 9)
  78.                     dF.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
  79.                 End If
  80.             ElseIf Weekday(arr(i, 2), 2) = 7 Then
  81.                 If dA.Exists(arr(i, 1)) Then
  82.                     dG(arr(i, 1)) = dG(arr(i, 1)) + arr(i, 8)
  83.                     dH(arr(i, 1)) = dH(arr(i, 1)) + arr(i, 9)
  84.                     dI(arr(i, 1)) = dI(arr(i, 1)) + IIf(arr(i, 10) = "", 0, arr(i, 10))
  85.                 Else
  86.                     dG.Add arr(i, 1), arr(i, 8)
  87.                     dH.Add arr(i, 1), arr(i, 9)
  88.                     dI.Add arr(i, 1), IIf(arr(i, 10) = "", 0, arr(i, 10))
  89.                 End If

  90.             End If
  91.                     dJ.Add arr(i, 1), arr(i, 7)
  92.         Next
  93.         x = 1
  94.         For Each k In dA.keys
  95.             x = x + 1
  96.             .Cells(x, 14) = k
  97.             .Cells(x, 15) = dA(k)
  98.             .Cells(x, 16) = dB(k)
  99.             .Cells(x, 17) = dC(k)
  100.             .Cells(x, 18) = dD(k)
  101.             .Cells(x, 19) = dE(k)
  102.             .Cells(x, 20) = dF(k)
  103.             .Cells(x, 21) = dG(k)
  104.             .Cells(x, 22) = dH(k)
  105.             .Cells(x, 23) = dI(k)
  106.             .Cells(x, 24) = dJ(k)
  107.         Next
  108.      [N1].Value = "姓名"
  109.      [O1].Value = "正常出勤时间"
  110.      [P1].Value = "加点时间"
  111.      [Q1].Value = "加点次数"
  112.      [R1].Value = "周六白天"
  113.      [S1].Value = "周六晚上"
  114.      [T1].Value = "周六加点次数"
  115.      [U1].Value = "周日白天"
  116.      [V1].Value = "周日晚上"
  117.      [W1].Value = "周日加点次数"
  118.      [X1].Value = "部门"

  119.      '以下代码是为E列F列有空白格的行涂上黄色
  120.      [a:j].Interior.ColorIndex = xlNone
  121.      For i = 2 To [e:f].Find("*", searchdirection:=xlPrevious).Row
  122.        If Cells(i, 5) <> "" And Cells(i, 6) = "" Or Cells(i, 6) <> "" And Cells(i, 5) = "" Then
  123.            Cells(i, 1).Resize(1, 10).Interior.ColorIndex = 6
  124.        End If
  125.      Next
  126.     End With
  127.         
  128. End Sub
  129. Function 取值(ByVal x As Double) As Double
  130.     If x - Int(x) > 0.83333 Then
  131.         取值 = Round(x, 0)
  132.     ElseIf x - Int(x) < 0.33333 Then
  133.         取值 = Int(x)
  134.     Else
  135.         取值 = Int(x) + 0.5
  136.     End If
  137. End Function
复制代码
按“雪舞子”的方法帮你修改了一下,运行后完全没有错误了:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-3 08:14 , Processed in 0.304694 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表