Para que al presionar el botón solo haga una búsqueda tienes que borrar la línea:
Cells.FindNext(After:=ActiveCell).Activate
y dejar el resto.
Ahora bien. Esto te hace volver al inicio, al valor encontrado con número de fila y columna menor y no debe dar error nunca salvo que no existan valores. Si te da error habiendo valores es lo que me cuesta ver. Si te da error no habiendo ninguna coincidencia es normal y se puede tratar el error añadiendo a tu código el tratamiento correspondiente.
Si quieres saber cuando llegas al final es mejor hacer la búsqueda en dos pasos. En el primero:
Set rngesta = Cells.Find (What......
donde rngesta es una variable de tipo rango. Esto también te sirve para el caso de error si usas la clausula
On error resume next
e incluyes la comprobación inmediatamente después.
Para saber donde empezaste a buscar y por tanto saber que has llegado vuelto al principio tienes varias posibilidades. Todas se basan básicamente en marcar de alguna manera las celdas que has pasado. Por ejemplo:
- Poner en negrita, color, fondo.. a medida que recorres celdas
- Comprobár que fila y después columna son crecientes
- Quedarte con la primera(tendrías que hacerlo fuera del código del botón) y comprobar cuando has vuelto a ella.
Quizá la segunda opción es la más sencilla. El código podría ser algo como:
...
fin = False
If Encontrado.Row < i Then
fin = True
Else
If (Encontrado.Row = i) And (Encontrado.Column <= j) Then
fin = True
End If
End If
If fin Then MsgBox ("Final alcanzado")
En realidad el mensaje sale al volver al principio pero lo puedes cambiar fácilmente para que aparezca cuando llegas al final sin mas que situar en el else del último If la activación del rango encontrado.
Todo junto en un procedimiento que puedes llamar desde la activación del botón seria algo como:
Sub Prueba_Busqueda()
Dim Quebusco As String
Dim Encontrado As Range
Dim i As Integer
Dim j As Integer
Dim fin As Boolean
On error resume next
Quebusco = TextBox1.Value
i = Selection.Row
j = Selection.Column
Set Encontrado = Cells.Find(What:=Quebusco, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Encontrado Is Nothing Then
MsgBox "No hay coincidencias"
else
fin = False
If Encontrado.Row < i Then
fin = True
Else
If (Encontrado.Row = i) And (Encontrado.Column <= j) Then
fin = True
End If
End If
If fin Then
MsgBox ("Final alcanzado")
Else
Encontrado.Activate
End If
end if
End Sub