VBA实战技巧精粹016:关于Find方法解决如何由前向后及由后往前的查找与替换
原来的问题是①如何实现从前向后查找或从后向前查找;②若查找不到的话,如何处理。
看不懂代码的感觉和看懂了并能进一步改进的感觉就是不一样啊。
不管想解决哪一个问题,都离不开find方法,所以按惯例(抄袭都成惯例,所以可以理解那些人为什么打嘴仗了……)先把官方解释给搬过来,因为我发现最权威的往往是官方解释,不服不行。
见谅啊,没办法,刚刚升级为G3.9,咱也不知道怎么回事,在VBA帮助文件里的东西复制到这儿竟然没法粘贴了,只能截图了,将就着吧,再说这也不是重点,因为这些东西,你的ExcelVBA也有。
下面看看如何从前向后查找,这也是我们最常用的操作了。
基本思路就是从最后1个单元格向后查找,怎么这样说呢?从最后1个单元格向后查找,已经是最后1个了,怎么还再向后查找?!是啊,就要这样,因为find方法支持回绕查找,所以这样正好。已经到最后1个单元格,再向后应该是哪一个呢?猜对了,又回到第1个了;再结合findnext,就可以实现从前向后查找了。
代码如下:
Sub 由前向后查找并替换()
Dim c As Range
Range("A1:A10").Value = 2
With Range("a1:a10")
Set c = .Find(2, After:=.Cells(.Cells.Count), LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
Do While Not c Is Nothing
c.Value = 5
Set c = .FindNext(c)
Loop
End With
End Sub
上面代码中红体字部分最重要,After参数为所选单元格区域的最后1个单元格,这样保证了是从最后1个单元格的下1个开始的,而SearchDirection参数指定了搜索的方向是向后搜索;而FindNext方法为继续查找下一个,两下配合就可以实现由前向后查找了。
那如何由后向前查找呢?很简单,将其中的After参数去掉(即为默认),将SearchDirection参数改成xlPrevious(即搜索方向为向前),后面的FindNext方法改成FindPrevious方法即可。注意After参数的默认值就是所选单元格区域的左上角的单元格,即第1个单元格,这下明白了吧?
Sub 由后向前查找并替换()
Dim c As Range
Range("A1:A10").Value = 2
With Range("a1:a10")
Set c = .Find(2, After:=.Cells(1), LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious)
Do While Not c Is Nothing
c.Value = 5
Set c = .FindPrevious(c)
Loop
End With
End Sub
上面两段代码都用到了条件:not c is nothing,这是什么意思呢?因为find、findnext、findprevious方法都可以返回range对象,若查找不到的话,就返回nothing,故可以利用这点来进行判断,很明显的如果为nothing则说明未查找到指定内容。