日/时差VBA

时间:2015-04-04 22:52:53

标签: excel-vba vba excel

您好我试图找出K列和J列中数据之间的时差。我需要知道数据需要花费多长时间来更新数据所需的天数,小时数或分钟数我正在使用那些列。我还想获得平均时间量,只有当列A中的名称匹配并在列N中输入该信息时。这是我到目前为止的第一部分。

ActiveSheet.Name = "Raw Data" Range("M2:M").Value = ("K2:K-J2:J" > 1) + ("d:hh:mm")

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这应该得到你想要的结果。 With ... End With block用于保存必须始终写Worksheets("Raw Data")。块中以.开头的任何内容都指向Worksheets("Raw Data")

该公式改编自this answer,但修改后允许超过31天。然后,我们使用FillDown method将单元格M2中的公式复制到与列K中最后一个使用的单元格相同的行。公式中的引用自动调整以指向正确的行

编辑:已更新,以计算A列中列出的每个名称的平均已用时间。这更复杂,因为我们无法直接平均我们放入M列的值,因为我们已将它们转换为文本格式。我选择使用Z列来保存我们需要的数字时间值。您可以选择任何其他未使用的列,也可以隐藏该列,使其不显示。

最后使用的行存储在变量中,因为我们需要在几个不同的地方使用它。列K和J之间的数字差异存储在列Z中。然后,根据列Z中的值计算M列中的文本值。

最后,使用AVERAGEIF function计算N列的平均值。这将查看A列中所有已使用的行,查找与当前行同名的那些行,然后对任何匹配行的Z列中的所有值进行平均。

需要注意的一点是:如果添加或删除任何行,则需要重写N列中的所有公式。这是因为如果添加或删除行,那么存储在这些公式中的最后一行值将变得不正确

With Worksheets("Raw Data")
  Dim lngLastUsedRow As Long
  lngLastUsedRow = .Cells(.Rows.Count, "K").End(xlUp).Row

  .Range("Z2").Formula = "=K2-J2"
  .Range("Z2:Z" & lngLastUsedRow).FillDown

  .Range("M2").Formula = "=FLOOR(Z2,1)&"":""&TEXT(Z2,""hh:mm"")"
  .Range("M2:M" & lngLastUsedRow).FillDown

  .Range("N2").Formula = "=AVERAGEIF(A$2:A$" & lngLastUsedRow & ",A2,Z$2:Z$" & lngLastUsedRow &")"
  .Range("N2:N" & lngLastUsedRow).FillDown
End With