Excel 为什么“查找对象”要搜索整个数据而不是指定的范围?
我是Vba新手(通常是编码),我编写了一个非常基本的宏,从一组较大的数据中找出特定列中的“wood”,但是当我尝试运行它时,它仍然从整个数据集而不是指定的列中进行搜索 我从保持Cel的范围到整个数据集开始,然后将其缩小到第三列。但是,当我删除find元素时,立即窗口会在第三列中显示单元格的地址,正如我所希望的那样,但一旦我使用find,它就会搜索整个数据集。 我曾尝试在Find对象中定义属性,例如After和SearchOrder,但随后它显示了一个错误Excel 为什么“查找对象”要搜索整个数据而不是指定的范围?,excel,vba,Excel,Vba,我是Vba新手(通常是编码),我编写了一个非常基本的宏,从一组较大的数据中找出特定列中的“wood”,但是当我尝试运行它时,它仍然从整个数据集而不是指定的列中进行搜索 我从保持Cel的范围到整个数据集开始,然后将其缩小到第三列。但是,当我删除find元素时,立即窗口会在第三列中显示单元格的地址,正如我所希望的那样,但一旦我使用find,它就会搜索整个数据集。 我曾尝试在Find对象中定义属性,例如After和SearchOrder,但随后它显示了一个错误 Dim emptyrow As Long
Dim emptyrow As Long
emptyrow = WorksheetFunction.CountA(Range("A:A")) + 1
Dim Cel As Range
Dim n As Integer
Set Cel = Range("C2:C54")
For n = 2 To emptyrow
Debug.Print (Cel.Cells(n,3).Find("wood","C2",,,xlByColumn).Address)
Next n
在使用Find的属性时,我得到了一个类型不匹配错误。使用这个:
Sub fnd_all_wood()
Dim c As Range
Dim firstaddress As String
With Range("C2:C54")
Set c = .Find("wood", LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
Do
Debug.Print c.Address
Set c = .FindNext(c)
If c Is Nothing Then
GoTo DoneFinding
End If
Loop While c.Address <> firstaddress
End If
DoneFinding:
MsgBox "Done All"
End With
End Sub
Sub fnd_all_wood()
调光范围
将第一个地址设置为字符串
带量程(“C2:C54”)
设置c=.Find(“wood”,LookIn:=xlValues)
如果不是,那么c什么都不是
firstaddress=c.地址
做
调试.打印c.地址
集合c=.FindNext(c)
如果c什么都不是
后进先出
如果结束
在c.AddressFirstAddress时循环
如果结束
完成查找:
MsgBox“全部完成”
以
端接头
这将打印C2:C54范围内找到的Wood
有关链接中公式的详细信息
更新:
Sub fnd_all_wood()
Dim c As Range
Dim firstaddress As String
With Range("C2:C54")
Set c = .Find("wood", LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
Do
Debug.Print c.Address
Set c = .FindNext(c)
If c Is Nothing Then
GoTo DoneFinding
End If
Loop While c.Address <> firstaddress
End If
DoneFinding:
MsgBox "Done All"
End With
End Sub
您可以将行Debug.Print c.Address
更改为任何其他代码,在该代码中,您可以通过c.row
获取行,并使用它获取其他值,如单元格(c.row,1)
以从列表列获取值
演示:
Sub fnd_all_wood()
Dim c As Range
Dim firstaddress As String
With Range("C2:C54")
Set c = .Find("wood", LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
Do
Debug.Print c.Address
Set c = .FindNext(c)
If c Is Nothing Then
GoTo DoneFinding
End If
Loop While c.Address <> firstaddress
End If
DoneFinding:
MsgBox "Done All"
End With
End Sub
目前还不清楚您想要对结果做什么,但这里有几个可能的输出
Sub xx()
Dim rFind As Range, s As String, v() As Variant, i As Long
With Range("C2:C54")
Set rFind = .Find(What:="Wood", After:=.Cells(.Cells.Count), _
Lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
If Not rFind Is Nothing Then
s = rFind.Address
Do
Debug.Print rFind.Offset(, -2).Value 'column A value in immediate window
i = i + 1
ReDim Preserve v(1 To i)
v(i) = rFind.Offset(, -2).Value 'or store values in an array
Set rFind = .FindNext(rFind)
Loop While rFind.Address <> s
End If
End With
MsgBox Join(v, ", ")
End Sub
Sub-xx()
Dim rFind作为范围,s作为字符串,v()作为变量,i作为长度
带量程(“C2:C54”)
设置rFind=.Find(What:=“Wood”,After:=.Cells(.Cells.Count)_
Lookat:=xlother,MatchCase:=False,SearchFormat:=False)
如果不是,那么rFind什么都不是
s=查找地址
做
Debug.Print rFind.Offset(,-2).Value'列是即时窗口中的一个值
i=i+1
重读保留v(1到i)
v(i)=rFind.Offset(,-2).Value'或将值存储在数组中
设置rFind=.FindNext(rFind)
在rFind.Address s时循环
如果结束
以
MsgBox联接(v,“,”)
端接头
如果没有循环,请尝试Debug.Print Cel.Find(“wood”).Address
After参数应该是范围对象,而不是地址字符串(或者省略它)。还请注意,您当前正在搜索列E。您不需要循环,您可以一次搜索整个范围,但如果未找到“wood”,您的代码将出错。另外,cell.Cells(n,3)
在n=2时相当于E4,因为这是一个相对引用。@Mikku,没有循环,它只返回遇到的第一个值,不搜索其余值。@Kushagramital。。查看答案这很好,但为了安全起见,我认为最好指定更多的Find参数,以防它们不是您所期望的。Idk为什么,但当我尝试运行您的代码时,它会给我一个运行时错误“91”。未设置对象变量或带块变量@Mikku@KushagraMittal .. 在哪一条线上?但是很好,您可以使用SJR提供的一个。它位于firstaddress=c.Address上。我只是想确定为什么我会出现这个错误,并在我未来的程序中避免它。也许这就是SJR纠正的错误。尝试更新的代码。这是因为firstaddress
应该声明为String,我错误地将其声明为Range。