比较VBA中的时间

时间:2016-04-07 16:24:54

标签: excel vba excel-vba date

如果时间戳在过去两分钟+7小时内,我正在尝试扫描一列时间并复制/粘贴该行。我的时间戳的日期部分没有阵容,我需要将它们转换为相同的日期而不更改时间。

这是我的代码:

Sub Timecompare()

Dim i As Integer
Dim lRow As Integer
Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set ws1 = Sheets("Volm")
Set ws2 = Sheets("Sheet2")

'goal:
'scan all rows in dataset
'if cell time > current time - 2 minutes
'copy pasta

With ws1
    'find the last row
    lRow = .Cells(.Rows.Count, "E").End(xlUp).Row
    'loop through all the rows
    For i = 10 To lRow
        'if the cell value is greater than time + 7 hours - 2 minutes then copy/paste the row to new sheet
        If .Cells(i, 18).Value > Now + TimeSerial(7, 0, 0) - TimeSerial(0, 2, 0) Then
            ''' just spitting out the values in the comparator above so I can see the results and why they aren't comparing properly '''
            ws2.Cells(i, 1).Value = .Cells(i, 18).Value
            ws2.Cells(i, 2).Value = Now + TimeSerial(7, 0, 0) - TimeSerial(0, 2, 0)
            Exit For
        End If
    Next i

End With

End Sub

“。Cell(i,18).Value”输出如下所示:.704461794(一般格式)或1/0/00 4:54 PM(日期格式)

“Now + TimeSerial(7,0,0) - TimeSerial(0,2,0)”输出如下所示:42467.75336(通用格式)或4/7/16 6:04 PM(日期格式)。

我不在乎约会。我所关心的只是时间。那么有没有办法将“.Cells(i,18).Value”同时带到今天,或者将Now()+ 7小时 - 2分钟的日期带回到1/0/00?重申一下,我只是想让我的苹果变成苹果,这样我才能比较时间。

3 个答案:

答案 0 :(得分:1)

我只想抽出时间:

upperTime = GetTime(Now + TimeSerial(7, 0, 0) - TimeSerial(0, 2, 0))

With ws1
  For i = 10 To lRow

      ' compare on the time only '
      If GetTime(.Cells(i, 18).Value) > upperTime Then

          ' copy the time only '
          ws2.Cells(i, 1).Value = GetTime(.Cells(i, 18).Value)

          ' copy the current date plus the time from the cell '
          ws2.Cells(i, 2).Value = GetDate(Now) + GetTime(.Cells(i, 18).Value)

          Exit For
      End If
  Next i
End With

提取日期部分或时间部分的功能:

' Returns the date part from a date/time '
Public Function GetTime(datetime As Date) As Date
  GetTime = datetime - VBA.Fix(datetime)
End Function

' Returns the time part from a date/time '
Public Function GetDate(datetime As Date) As Date
  GetDate = VBA.Fix(datetime)
End Function

答案 1 :(得分:0)

创建一个变量并在循环外为其指定Now + TimeSerial(7, 0, 0) - TimeSerial(0, 2, 0)。在循环中使用该变量而不是表达式(我可以看到2个位置)

创建另一个变量并在循环外将today()赋值给它。在比较中使用.Cells(i, 18).Value + <That Variable>。如果你不认为这个宏的执行将跨越午夜,你可以直接使用today()而不是使用变量。

答案 2 :(得分:0)

我相信你的算法必须考虑午夜过境。根据您的问题的措辞(在您的代码示例上方),我尝试了以下测试:

view

这似乎给出了你想要的结果。