当时间格式为m / d / yyyy hh:mm:ss时,VBA Excel发现时间差异

时间:2014-06-17 11:38:09

标签: excel vba excel-vba

我在VBA for Excel方面有一些经验,目前我有2张数据表,我需要比较和提取数据。

Sheet1看起来像:

A                        B      C       D       E
06/06/2014 00:01:04     \PLUTUS xxxx    xxxx    DERP.OPERATOR
06/06/2014 00:06:05     \PELEUS xxxx    xxxx    LOL.OPERATOR
06/06/2014 00:11:05     \PLUTUS xxxx    xxxx    DERP.OPERATOR
06/06/2014 00:15:42     \CHARON xxxx    xxxx    SUPEROP-DERP
06/06/2014 00:16:06     \PLUTUS xxxx    xxxx    DERP.OPERATOR

Sheet2看起来像:

A       B       C        D      E       F               G       H
xxxx    xxxx    xxxx    \castor xxxx    SOLDOP-DERP     xxxx    06/06/2014 03:27:58
xxxx    xxxx    xxxx    \oberon xxxx    BBMOP-DERP      xxxx    06/06/2014 03:30:04
xxxx    xxxx    xxxx    \charon xxxx    SUPEROP-DERP    xxxx    06/06/2014 03:32:55
xxxx    xxxx    xxxx    \peleus xxxx    LOL.OPERATOR    xxxx    06/06/2014 09:55:31
xxxx    xxxx    xxxx    \plutus xxxx    GBSOP-DERP      xxxx    06/06/2014 10:00:22

我需要确保针对所有Sheet1 F Cell值检查每个Sheet2 E Cell Value。

如果找到匹配项,则检查是否在Sheet1行中,Cell B是否匹配Sheet2 Cell D的值。

如果这两个都为TRUE,则宏应该比较Sheet1 Cell A时间中的行是否大于或等于Sheet2 Cell H中的时间,但不超过Cell H + 12hours中的时间。

如果所有三个陈述都为真,那么Sheet1的时间应该复制到Sheet2 Cell I。

如何比较,找出日期和时间的差异?

Lrow = 2
Lrow2 = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 'get's the number of all sheet1 rows'
Lrow3 = 1
Lrow4 = Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row 'number of all Sheet2 rows'

SearchStr = Sheets("Sheet2").Range("F" & rownumbers1).Value 
SearchStr2 = Sheets("Sheet2").Range("D" & rownumbers1).Value
For rownumbers1 = Lrow3 To Lrow4
    For rownumbers = Lrow To Lrow2
        If SearchStr = Sheets("Sheet1").Range("E" & rownumbers).Value 
         And 
         SearchStr2 = Sheets("Sheet1").Range("B" & rownumbers).Value 
         And 
         ***Sheets("Sheet2").Range("H" & rownumbers1).Value =< Sheets("Sheet1").Range("A" & rownumbers).Value < Sheets("Sheet2").Range("H" & rownumbers1).Value + 12 hours***
         Then
            Sheets("Sheet2").Range("I" & rownumbers1).Value = Sheets("Sheet1").Range("A" & rownumbers).Value
            Next rownumbers1
        Else
            Next rownumbers
        End If

请告知如何进行日期和时间比较部分!提前谢谢!

2 个答案:

答案 0 :(得分:1)

VBA 中比较日期/时间的任何简单方法是将它们转换为浮点值。此 UDF 会比较两个日期/时间,并且仅当第二个日期/时间大于或等于第一个日期/时间时才会返回 TRUE ,但不会超过12个小时第一:

Public Function CompareTimes(r1 As Range, r2 As Range) As Boolean
    Dim d1 As Date, d2 As Date, f1 As Double, f2 As Double
    d1 = r1.Value
    d2 = r2.Value
    f1 = CDbl(d1)
    f2 = CDbl(d2)
    CompareTimes = False
    If f2 < f1 Then Exit Function
    If f2 > f1 + 0.5 Then Exit Function
    CompareTimes = True
End Function

您可以在 Sub 中使用 UDF ,例如:

Sub MAIN()
    Dim r1 As Range, r2 As Range
    Set r1 = Sheets("Sheet1").Range("B9")
    Set r2 = Sheets("Sheet2").Range("A1")
    MsgBox CompareTimes(r1, r2)
End Sub

答案 1 :(得分:0)

1)你不能写If dt1 <= dt2 < dt3 Then...。相反,你必须分两步比较:
If dt1 <= dt2 And dt2 < dt3 Then...
2)另外,使用
可以节省时间并提高清晰度 Cell(3,rownum)而非 Range("C" & rownum).value
此处不需要.Value,因为它是默认属性,对于1个单元格范围,您可以避免某些计算/连接/转换。