Excel-VBA:搜索具有特定时间值

时间:2015-08-24 14:37:44

标签: excel-vba vba excel

这是我的代码:

Sub FindMatchingValue()
    Dim i As Integer, TimeValueToFind As Date
    TimeValueToFind = "00:00:00"
    Sheets("Vessels").Range("F07").ClearContents
    For i = 1 To 25   '
        If Sheets("Vessels").Cells(i, 1).Value = TimeValueToFind Then
            MsgBox ("Found value on row " & i)

            Sheets("Vessels").Range("F07").Value = Cells(i, 1).Offset(1, 1).Resize(1).Value
            Exit Sub
        End If
    Next i
    MsgBox ("Value not found in the range!")
End Sub

此代码检查A列以xx格式输入的时间:xx:xx输入的位置和写入时间的位置均设置为" Time"格式

A栏中有一张时间为00:00:00至23:00:00的表格。 出于某种原因,此代码仅在尝试查找00:00:00时才起作用,根本找不到其他时间值。我无法弄清楚原因。 我认为这可能是因为TimeValueToFind是"作为Date"。然而似乎没有" As Time"虽然?不确定为什么这不起作用。如果这就是为什么它不起作用,为什么00:00:00被发现但没有别的?我打赌这是一个简单的错误,但我会非常感激一些帮助。

有关其他信息:

潮汐时间是A栏。

Tidal Time  Tidal Height
00:00:00    
01:00:00    
02:00:00    
03:00:00    
04:00:00    4.40
05:00:00    4.00
06:00:00    3.60
07:00:00    3.20
08:00:00    2.80
09:00:00    2.40
10:00:00    2.00
11:00:00    2.37
12:00:00    2.74
13:00:00    3.11
14:00:00    3.49
15:00:00    3.86
16:00:00    4.23
17:00:00    4.60
18:00:00    4.13
19:00:00    3.67
20:00:00    3.20
21:00:00    2.73
22:00:00    2.27
23:00:00    1.80

A栏的完整性是时间。现在了解一段时间我很重要的是我现在已经在面对自己,因为i到25应该是2到25,字符串潮汐高度是不正确的格式,这就是为什么错配错误。

3 个答案:

答案 0 :(得分:1)

那是因为你想比较苹果和橘子。 TimeValueToFind类型为DateSheets("Vessels").Cells(i, 1).Value生成double(同时添加到监视窗口并检查)。

您可以将TimeValueToFind转换为double或将Sheets("Vessels").Cells(i, 1).Value转换为Date来使其有效:

' (...)
If CDate(Sheets("Vessels").Cells(i, 1).Value) = TimeValueToFind Then
' (...)

或者:

' (...)
delta = Sheets("Vessels").Cells(i, 1).Value - CDbl(TimeValueToFind)
If Abs(delta) <= tolerance Then
' (...)

答案 1 :(得分:1)

Excel将时间存储为一天的分数。所以00:00:00小时是一天的0/24。小时01:00:00是一天的24/24或.041666等。您需要与这些值进行比较。如果你测试A列中的值,你会看到它是一个从0到1的数字。如果你运行这样的东西,你可以看到发生了什么。

Sub Test()
Dim i As Integer
Dim Test As Variant

For i = 1 To 24
    Test = Sheets("Sheet1").Cells(i, 1).Value
    Sheets("Sheet1").Cells(i, 2).Value = Test
Next i

End Sub

答案 2 :(得分:1)

在内部,Excel将数字存储为double。众所周知,当a==bFalse都是双倍时,a表达式可能会返回b,即使您可能认为他们是相同的。这是由于存储浮点数的精度有限。

您有多种选择。

1)设置公差。 If abs(a-b)<tolerance Then

2)转换为具有固定位数的字符串,并比较字符串。这明确地做了以上隐含的内容

第一种方法通常被认为是要走的路。当您使用浮点数时,应禁止从词汇表中测试相等性。