VBA:计算时间戳

时间:2017-03-20 16:19:46

标签: excel vba excel-vba

目前有一个试图计算相同时间戳的宏。

正如您在下面的代码中看到的那样,我将时间戳转换为值,然后使用COUNTIFS(),根据该值计算相同的时间戳。

然后,如果它计算相同标记的2个或更多,则该关联名称将出现在新工作表的列表中(还会生成一个缺少时间戳的关联列表)。

现在,我真正想做的是看看我是否可以根据彼此在两分钟内的时间戳来计算。我认为我应该摆脱整个价值转换并找到一种方法来计算实际时间戳,但这正是我带到这里的原因,因为我不太确定如何处理它!

提前谢谢大家。欢呼声。

以下是我正在使用的屏幕截图:

https://i.stack.imgur.com/aLBd9.png

    'Convert date to value

For x = 2 To lastrow

    Cells(x, 22) = "=LEFT((VALUE(RC[-4])),9)"

Next

Range("V:V").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

'Count for duplicate time stamps


For x = 2 To lastrow

    Cells(x, 23) = "=COUNTIFS(RC[-1]:R[918]C[-1],RC[-1],RC[-11]:R[918]C[-11], RC[-11])"

Next

Range("W:W").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

'If same time stamp is seen 2 or more times for a given associate, their name will appear in column X
'If an associate is missing timestamps altogether, their name will appear in column Y

For x = 2 To lastrow

    If Cells(x, 18) = "" Then Cells(x, 25) = Cells(x, 12)
    If Cells(x, 23) >= 2 And Cells(x, 18) <> "" Then Cells(x, 24) = Cells(x, 12)

Next

Columns("X:X").Select
ActiveSheet.Range("$X$1:$X$920").RemoveDuplicates Columns:=1, Header:=xlYes
Columns("Y:Y").Select
ActiveSheet.Range("$Y$1:$Y$920").RemoveDuplicates Columns:=1, Header:=xlNo

2 个答案:

答案 0 :(得分:0)

2/1440是两分钟的十进制值... excel中的时间是数字...你可以用+ - 2/1440来制作条件

答案 1 :(得分:0)

所以你追求的是一种比较日期的方法。这是一个非常棒的函数,名为DateDiff

Dim aRR As Variant
aRR = ThisWorkbook.Sheets("Sheet1").Range("V2:W300")
Dim empName As String
Dim timeStamp As Date

Dim i As Integer

For i = LBound(aRR, 1) To UBound(aRR, 1)
    empName = aRR(i, 0)
    timeStamp = aRR(i, 1)
    For j = LBound(aRR, 1) To UBound(aRR, 1)
        If aRR(j, 0) <> aRR(i, 0) Then
            If aRR(i, 0) = aRR(j, 0) And (aRR(i, 1) = aRR(j, 1) Or DateDiff("n", aRR(i, 1), aRR(j, 1)) <= 2) Then
                'logic used for moving names over
            End If
        End If
    Next j
Next i

为了能够有效地使用它,你可能需要稍微重写一下你的循环。这可能会变得很容易b / c你最后删除重复项,所以不需要对你的循环结构感到满意。我会做的是这样的事情。我使用了数组,但如果您愿意,可以只刷一下DateDiff部分。这也是未经测试的。我认为它会满足您的需求。

plt.legend()

因为你不熟悉数组,我想我会为你解释它们。我们正在使用的数组是二维数组。把它想象成一个工作表。引用数组点时,通常使用ArrayName(行,列)。当您使用Lbound或UBound(上限与下限)时,您必须声明要扫描的数组的哪个维度(1是第一个维度,或0,依此类推)。在这个特定的实例中,我只循环通过第一个维度而不是整个数组b / c我们真的只需要使用员工姓名(EmpName),因为通过说aRR(i,1)来引用日期/时间戳是最简单的。被读作&#34;数组(循环i)第1列中的当前点。