Excel VBA:搜索具有特定时间值的单元格
这是我的代码:Excel VBA:搜索具有特定时间值的单元格,excel,vba,Excel,Vba,这是我的代码: 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 T
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格式输入的时间,输入位置和写入时间的位置均设置为“时间”格式
a列中有一个时间为00:00:00到23:00:00的表格。
由于某些原因,此代码仅在尝试查找00:00:00时有效,而找不到任何其他时间值。我想不出原因。我想这可能是因为TimeValueToFind是“as Date”。然而,似乎并没有“随着时间的推移”呢?不确定为什么这不起作用。如果这就是为什么它不起作用的原因,为什么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,字符串潮汐高度的格式不正确,这就是错配错误的原因。这是因为你试图比较苹果和橘子。
TimeValueToFind
类型为Date
和Sheets(“vessers”)。单元格(i,1)。Value
产生一个double
(将两者添加到手表窗口并检查)
您可以通过将TimeValueToFind
转换为double
或将Sheets(“vessers”).Cells(i,1).Value
转换为Date
:
' (...)
If CDate(Sheets("Vessels").Cells(i, 1).Value) = TimeValueToFind Then
' (...)
或:
(…)
delta=板材(“容器”).单元(i,1).值-CDbl(时间值-查找)
如果Abs(delta)Excel将时间存储为一天的分数。所以00:00:00是一天的0/24。小时01:00:00是一天的1/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
在内部,Excel将数字存储为
double
。众所周知,当a
和b
都是双倍时,表达式a==b
可能返回False
,即使您可能认为它们是相同的。这是因为浮点数的存储精度有限
你有多种选择
1) 设定一个公差<代码>如果abs(a-b)检查IsDate(像00:00:00这样的单元格)是否返回true.Hm和CDate,我得到类型missmatch错误。将TimeValueToFind转换为CDbl也找不到输入的时间值,因为存在公差,需要注意的是,正如您(和其他人)所指出的,更新了答案以反映double的精度不足。旧习难改。。。至于类型不匹配,这可能与单元格值的格式有关,因为转换时,
CDate
函数会考虑您的区域设置。现在似乎在双精度上也出现了类型不匹配错误。我的代码如下所示:Sub FindMatchingValue()Dim i为整数,TimeValueToFind为Date TimeValueToFind=“04:00:00”Sheets(“Vessers”)。范围(“F07”)。ClearContent For i=1到25 Delta=Sheets(“Vessers”)。单元格(i,1)。Value-CDbl(TimeValueToFind)如果Abs(Delta)在这里没有错误。。。您可以发布您的输入样本吗?另外,如果您有选项Explicit
,您是否同时声明(Dim
)了Delta
和公差
?这些不是类型不匹配,而是编译错误,而是检查。
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