Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么“查找对象”要搜索整个数据而不是指定的范围?_Excel_Vba - Fatal编程技术网

Excel 为什么“查找对象”要搜索整个数据而不是指定的范围?

Excel 为什么“查找对象”要搜索整个数据而不是指定的范围?,excel,vba,Excel,Vba,我是Vba新手(通常是编码),我编写了一个非常基本的宏,从一组较大的数据中找出特定列中的“wood”,但是当我尝试运行它时,它仍然从整个数据集而不是指定的列中进行搜索 我从保持Cel的范围到整个数据集开始,然后将其缩小到第三列。但是,当我删除find元素时,立即窗口会在第三列中显示单元格的地址,正如我所希望的那样,但一旦我使用find,它就会搜索整个数据集。 我曾尝试在Find对象中定义属性,例如After和SearchOrder,但随后它显示了一个错误 Dim emptyrow As Long

我是Vba新手(通常是编码),我编写了一个非常基本的宏,从一组较大的数据中找出特定列中的“wood”,但是当我尝试运行它时,它仍然从整个数据集而不是指定的列中进行搜索

我从保持Cel的范围到整个数据集开始,然后将其缩小到第三列。但是,当我删除find元素时,立即窗口会在第三列中显示单元格的地址,正如我所希望的那样,但一旦我使用find,它就会搜索整个数据集。 我曾尝试在Find对象中定义属性,例如After和SearchOrder,但随后它显示了一个错误

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。