为什么我的VBA SearchFormat向后工作?

时间:2018-09-26 14:24:30

标签: excel vba

好吧,这个让我非常震惊。我将FindFormat设置为Bold,将SearchFormat设置为False,因此将选择搜索字符串的第一个非粗体实例。但是,当我在Debug中离开Found.Select行时,就选择了粗体实例!我想念什么吗? PS我以前被宣布...

Range(Cells(3, 3).Address(), Cells(lRow, 3).Address()).Select

Dim cn(0 To 300) As String
Dim Found As Range
Application.FindFormat.Font.Bold = True
i = 0

With Selection

    For Each Drawing In dn
            Set Found = .Find(Drawing, SearchFormat:=False)
            Found.Select
            ActiveCell.Offset(0, 3).Select
            cn(i) = ActiveCell.Value
            i = i + 1
    Next

End With

1 个答案:

答案 0 :(得分:0)

未传递要照顾的正确第一个元素。 VBA采用默认值,即第一个,但它开始照顾它。

这是一些示例数据,在B列中搜索数字:

enter image description here

Sub TestMe()
    Dim myR     As Range
    Dim myS     As Range
    Set myS = Range("B1:B5") 'change the range to "C1:C5" correspondingly 
    With myS
        Set myR = .Find(1)
        Debug.Print myR.Row
        Set myR = .Find(1, after:=.Cells(.Cells.Count))
        Debug.Print myR.Row
    End With
End Sub

This is the "After" parameter in MSDN

  

要开始搜索的单元格。这对应于从用户界面进行搜索时活动单元格的位置。注意,After必须是该范围内的单个单元格。请记住,搜索是在此单元格之后开始的;在该方法回绕到该单元之前,不会搜索指定的单元。如果不指定此参数,则搜索将在范围左上角的单元格之后开始。

因此,您将最后一个单元格作为开始。它知道它应该在它之后开始。因此,从理论上讲,它没有更好的选择,而只是从范围的开头开始。 After参数的想法是设置将要检查的最后一个值。因此,如果我们只有一个值,则无论After参数如何,总是可以正确返回。如果有多个值,它将返回找到的第一个值。

因此,在上面的代码中,由于使用了Range.Find()之后,按以下顺序搜索单元格:

B1> B2> B3> B4> B5

不包含“之后”序列,如下所示:

B2> B3> B4> B5> B1

值得多次运行带有示例的代码。的确,默认参数没有按照人们期望的方式设置。我的意思是,如果我给出一个范围并对其进行调查,那么我希望默认情况下首先检查第一个单元格。并且不要检查最后一个单元格,因为它是After(未设置)的默认参数。

相关问题