Macro de buscar datos

En un Userform tengo un textbox y un CommandButton, en el ultimo tengo el siguiente código:
Dim Quebusco As String
Quebusco = TextBox1.Value
Cells.Find(What:=Quebusco, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Cells.FindNext(After:=ActiveCell).Activate
Entonces aquí hay dos problemas, el primero es que si no encuentra el dato a buscar me manda un error en donde esta "Cell.Find", y la segunda, que si encuentra lo que busca lo que necesito es que cuando le de otra vez al CommandButton me busque el seguíente dato, y se supone que para eso es esta linea (Cells.FindNext(After:=ActiveCell).Activate), pero solo funciona una vez, entonces es ilógico poner mil lineas de estas si hay mil datos a buscar ya que se haría muy pesado la macro, ese es mi problema.

1 respuesta

Respuesta
1

Tu código hace dos búsquedas cada vez que se ejecuta porque tiene Cells. Find y Cells. FindNext. En ambos casos busca el texto a partir de la celda activa en ese momento. Es decir, desde la celda que tengas seleccionada hacia abajo y por columnas intenta encontrar el valor. Si lo encuentra lo selecciona pero inmediatamente después busca el siguiente y se para en él. Si vuelves a ejecutar el código sin seleccionar ninguna celda 8y como está seleccionado el último encontrado) vuelve a ponerse en la celda con el segundo valor encontrado.

Si esto lo tienes asociado a un botón, cada vez que lo pulses te va saltando al siguiente segundo valor encontrado. Al final de la columna sigue por la siguiente donde existan datos y así continuamente, para al final volver al inicio.

Es una macro un poco rara que busque saltando valores, pero no sé tus necesidades claro está. Lo del error es raro. Tendría que saber que datos tienes, que error te dá y que no haya algo que esté alterando la búsqueda como por ejemplo que no estés buscando errores precisamente.

ok, lo que en realidad quiero hacer, es que cada vez que presione el commandbuttom, me seleccione la primera coincidencia encontrada, y si lo presiono por segunda vez que busque a partir de la celda seleccionada el siguiente valor y asi sucesivamente, los datos son aleatorios, si yo pongo en el textbox la palabra "hola", y la tengo en el rango a1, la busque al presionar el commandbuttom y se vaya a la celda que la encontró, y si presiono por segunda vez el commandbuton busque a partir de la celda activa el siguiente valor y también que se posicione sobre el y asi sucesivamente hasta ya no encontrar mas coincidencias, y cuando ya no encuentre mas coincidencias me diga un msgbox que ya no se encontraron mas coincidencias,

espero haber sido claro

slds

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas