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

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

Sheet1看起来像:

ABCDE 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看起来像:

 ABCDEFGH 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 

我需要确保每个Sheet2 E单元格值都被检查所有Sheet1 F单元格值。

如果发现匹配,则检查在Sheet1行中的单元格B是否匹配Sheet2单元格D的值。

如果这两个都是TRUE,则macros应比较Sheet1单元格A中的行数大于或等于Sheet2单元格H中的时间,但不超过单元格H + 12小时中的时间。

如果所有三个陈述都是真的,那么Sheet1的时间应该被复制到Sheet2单元I.

我如何比较,找出date和时间的差异?

 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 

请告知如何做date和时间比较部分! 提前致谢!

VBA中比较date/时间的简单方法是将它们转换为浮点值。 这个UDF比较两个date/时间,只有当第二个date/时间大于或等于第一个date/时间时才会返回TRUE ,但不会比第一个date/时间大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)你不能写If dt1 <= dt2 < dt3 Then... 相反,你必须分两步进行比较:
If dt1 <= dt2 And dt2 < dt3 Then...
2)另外,你可能会节省时间,并通过使用提高清晰度
Cell(3,rownum)而不是
Range("C" & rownum).value
.Value在这里不是必需的,因为它是默认属性,对于1个单元格区域,您可以避免一些计算/连接/转换。