vba 区域. find函数找到第二个单元格却忽略了第一个匹配单元格。
vba 区域. find函数找不到区域第一个,总是找到的第二个
timeRngs的区域范围(选中区域B列)如下图
而实际上被选中的是第二个内容为“8:30:00”的单元格,
但是第二天的第一个时间段"8:30:00"又出现了这种情况(第二个时间单元格被选中):
Range的Find有一个After选项,默认值为ActiveCell(或者区域的第一个单元格),从活动单元格下一单元格开始查找。
所以第一个会被跳过。
可以手动判断第一个是否符合条件,或者将区域转为数组(主要是提升处理速度,如果不在意速度直接遍历单元格)再遍历单元格,判断字符串是否符合要求(比如用instr,判断是否包含指定字符串)。
缺省情况下,VBA中的Find方法是在整个工作表中搜索,如果在搜索中有多个匹配项,它将只返回第一个。因此,可能是因为搜索的初始单元格在第二个匹配项前面。
要解决这个问题,可以使用Range.FindNext方法来查找下一个匹配项。你可以在一个循环中使用它来遍历每个匹配项,直到找到你想要的。代码如下:
Dim firstTimeRng As Range
Dim searchRange As Range
Set firstTimeRng = timeRngs.Find(What:="8:30:00", LookIn:=xlFormulas, LookAt:=xlPart, _
MatchCase:=False, MatchByte:=False, SearchFormat:=False)
If Not firstTimeRng Is Nothing Then
Set searchRange = firstTimeRng
Do
If searchRange.Value = "8:30:00" Then
searchRange.Select
Exit Do
Else
Set searchRange = timeRngs.FindNext(searchRange)
End If
Loop
End If
如果我的回答解决了您的问题,请采纳我的回答,如果没有解决,请详细描述问题
可参考实例:在VBA中使用Find方法 (扩展用法),链接:https://blog.csdn.net/gxiyv/article/details/1595405
根据要求设计了相应的表格,表格内容为:
Sub Macro2()
Dim firstTimeRng As Range
Dim timeRngs As Range
Set timeRngs = Columns(2)
timeRngs.Select
Set firstTimeRng = timeRngs.Find(What:="8:00:00", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False, MatchByte:=False, SearchFormat:=False)
firstTimeRng.Select
End Sub
按照逐条语句进行运行,可以有以下效果:
可以看出,能够准确选择第一个单元格,满足要求
如果问题得到解决请点 采纳~~
如果 VBA 的 Range.Find 函数找到了第二个匹配单元格而忽略了第一个,可能是因为在上一次搜索中没有正确设置开始搜索的位置。
默认情况下,Range.Find 函数从工作表的开头搜索,如果要找到第二个匹配单元格,则需要设置 After 参数,指示应在哪个单元格后开始搜索。
下面是一个示例代码:
Sub FindFirstAndSecondMatch()
Dim timeRngs As Range
Dim firstMatch As Range
Dim secondMatch As Range
' 设置要搜索的区域
Set timeRngs = Range("B1:B10")
' 搜索第一个匹配单元格
Set firstMatch = timeRngs.Find("some value", LookIn:=xlValues)
' 如果第一个匹配单元格不为空,则搜索第二个匹配单元格
If Not firstMatch Is Nothing Then
Set secondMatch = timeRngs.Find("some value", After:=firstMatch, LookIn:=xlValues)
End If
' 显示搜索结果
If Not firstMatch Is Nothing Then
MsgBox "Found first match at " & firstMatch.Address
Else
MsgBox "First match not found."
End If
If Not secondMatch Is Nothing Then
MsgBox "Found second match at " & secondMatch.Address
Else
MsgBox "Second match not found."
End If
End Sub
在 VBA 中,如果在某个区域中使用 Range.Find 方法,有时可能会找到第二个匹配单元格而忽略第一个。这是因为 Range.Find 方法在查找到匹配单元格时默认从当前单元格开始搜索,并向下移动。
要避免这个问题,可以使用以下代码:
vbnet
Copy code
Set myRange = Range("A1:A10")
Set foundCell = myRange.Find("myValue")
If Not foundCell Is Nothing Then
' The value was found in the range
Else
' The value was not found in the range
End If
这将从 A1 开始搜索,以确保找到的是第一个匹配单元格。
你可以尝试在 Find 函数中使用 After 参数来指定搜索的起始位置,将其设置为当前单元格的下一个单元格。这样可以确保第一个匹配项不被忽略。
下面是一个示例代码,可以搜索名为 "Sheet1" 的工作表中第一个内容为 "8:30:00" 的单元格并将其选中:
Sub FindFirst830()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim firstMatch As Range
Set firstMatch = ws.Range("A1:A10").Find("8:30:00", LookIn:=xlValues, LookAt:=xlWhole, After:=ws.Range("A1"))
If Not firstMatch Is Nothing Then
firstMatch.Select
Else
MsgBox "No match found"
End If
End Sub
在上面的代码中,Range("A1:A10") 是要搜索的范围,你可以根据你的实际情况进行更改。如果第一个匹配项仍然被忽略,你可以尝试将范围扩大到整个工作表。
另外,如果你只想在第一列中搜索,可以将 Range("A1:A10") 更改为 Range("A1").EntireColumn。
不知道你这个问题是否已经解决, 如果还没有解决的话:由于Range的Find有一个After选项,默认值为ActiveCell(或者区域的第一个单元格),从活动单元格下一单元格开始查找。
所以第一个会被跳过。
可以手动判断第一个是否符合条件,或者将区域转为数组(主要是提升处理速度,如果不在意速度直接遍历单元格)再遍历单元格,判断字符串是否符合要求(比如用instr,判断是否包含指定字符串)。
如果VBA find函数查找有误,可能是由于以下原因导致的:
搜索参数不正确:VBA find函数的搜索参数必须与要搜索的文本完全匹配,否则搜索将失败。
搜索范围不正确:VBA find函数只能搜索指定的范围,如果搜索范围不正确,搜索将失败。
搜索顺序不正确:VBA find函数默认从当前位置开始搜索,如果搜索顺序不正确,搜索将失败。
搜索文本不存在:VBA find函数只能搜索已存在的文本,如果要搜索的文本不存在,搜索将失败。
您好,根据您描述的问题,关于vba 区域. find函数找不到区域第一个,总是找到的第二个的错误,发生这个错误的原因可能有:
1、Find函数默认是从当前活动的单元格开始查找的,所有有可能是你没有从整个区域开始搜索导致当前活动的单元格是第一个,导致搜索出来的是第二个。
可以设置从指定单元格开始查找:比如从cells(2,2)这单元格开始查找:
设置After参数为最右边单元格Cells(2, 1000)
Set c = Range(Cells(2, 2), Cells(2, 1000)).Find("*", Cells(2, 1000), , 1)
2、检查第一个时间的格式是否有问题,比如多了空格等,导致第一个匹配不上
我还是没有听明白你说的是什么意思
如果VBA find函数查找有误,可能是由于以下原因导致的:
搜索参数不正确:VBA find函数的搜索参数必须与要搜索的文本完全匹配,否则搜索将失败。
搜索范围不正确:VBA find函数只能搜索指定的范围,如果搜索范围不正确,搜索将失败。
搜索顺序不正确:VBA find函数默认从当前位置开始搜索,如果搜索顺序不正确,搜索将失败。
搜索文本不存在:VBA find函数只能搜索已存在的文本,如果要搜索的文本不存在,搜索将失败。