为什么不是Range.Find方法find一个string的第一个实例?

在范围A1:I1 ,确切的string“* ContactName”会出现两次 – 一次在A1 ,再次在I1 。 这里是一个范围的图片的链接。

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

请有人解释为什么? 我已阅读微软的文档,但仍然无法弄清楚: 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 

从链接到的文档,关于可选参数After

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

你没有提供一个After因此在这种情况下,它默认为A1 。 请注意文档的部分说:“指定的单元格不search,直到方法回绕到这个单元格”。

如果你使用:

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

它会按照你的意图工作。

最好使用范围对象,并在返回列之前testing对象是否被find(否则代码将会出错)。

完全限定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