为什么Range.Find方法找不到字符串的第一个实例?

时间:2017-01-02 02:30:03

标签: excel vba excel-vba

A1:I1范围内,确切的字符串“* ContactName”会出现两次 - 一次出现在A1中,另一次出现在I1中。 Here is a link to a picture of the range.

当我期望返回1时,我的代码返回9。

请有人解释原因吗?我已经阅读了Microsoft的文档,但仍然无法弄明白:https://msdn.microsoft.com/en-us/library/office/ff839746.aspx

Sub FindCol()
    Dim destinationCol As Integer
    destinationCol = Range("A1:I1").Find("*ContactName").Column
    MsgBox destinationCol
End Sub

如果我改变代码从第一列开始,那么,正如预期的那样,该方法循环返回并返回1(A列)。

Sub FindCol()
    Dim destinationCol As Integer
    destinationCol = Range("A1:I1").Find("*ContactName", after:=Cells(1, 9)).Column
    MsgBox destinationCol
End Sub

2 个答案:

答案 0 :(得分:3)

从您链接的文档中,了解可选参数After

  

您希望搜索开始的单元格。这对应于   从用户进行搜索时活动单元格的位置   接口。请注意,After必须是范围内的单个单元格。   请记住,搜索在此单元格之后开始;指定的单元格   没有被搜索,直到该方法回绕到这个单元格。如果你   不指定此参数,搜索在单元格之后开始   范围的左上角。

您没有提供After因此在这种情况下默认为A1。请注意文档中的部分说明"指定的单元格不会被搜索,直到方法回绕到此单元格。"

如果您使用:

destinationCol = Range("A1:I1").Find("*ContactName", Range("I1")).Column

它会按你的意愿运作。

答案 1 :(得分:0)

最好使用范围对象并测试在返回列之前是否找到对象(否则代码将出错)。

还可以更好地完全限定Find参数(在这种情况下,在范围中的最后一个单元格之后开始,即在 I1 之后开始)

Sub FindCol()
    Dim rng1 As Range
    Set rng1 = Range("A1:I1").Find("*ContactName", [i1], xlFormulas, , xlNext)
    If Not rng1 Is Nothing Then MsgBox rng1.Column
End Sub