这是我的代码:
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,字符串潮汐高度是不正确的格式,这就是为什么错配错误。
答案 0 :(得分:1)
那是因为你想比较苹果和橘子。
TimeValueToFind
类型为Date
,Sheets("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==b
和False
都是双倍时,a
表达式可能会返回b
,即使您可能认为他们是相同的。这是由于存储浮点数的精度有限。
您有多种选择。
1)设置公差。 If abs(a-b)<tolerance Then
2)转换为具有固定位数的字符串,并比较字符串。这明确地做了以上隐含的内容
第一种方法通常被认为是要走的路。当您使用浮点数时,应禁止从词汇表中测试相等性。