Quiero seleccionar la fila del campo encontrado, usando un data bound grid(dbgird32.ocx) En el evento chage puse este código, pero me selecciona la primera fila del grid no la que tenga la palabra que más se parezca. Private Sub txtfindw_Change() Dim palabra As String palabra = txtfindw.text' caja de texto donde voy ingresando la palabra a buscar With dtwords.Recordset
'word es el campo donde busco la palabra .FindFirst "word = ' " & palabra & " ' " End With With DBGrid1 .SelBookmarks.Add .Bookmark End With End Sub
Me parece un poco fuerte que pongas la búsqueda en el Change del TextBox ya que esto lanzará la búsqueda por cada cambio del texto, esto es cada vez que teclees una letra de ese textbox. Como la búsqueda es un proceso relativamente lento esto se tiene que notar al teclear como una lentitud en la respuesta del TextBox. Parece más apropiado tenerlo en el evento LostFocus, para que la búsqueda se inicie una sola vez cuando el usuario ha terminado de teclear y pasa al dato siguiente. Sin embargo ese no es el problema, puesto que tal como lo tienes la búsqueda se realizaría con cada letra, tratando de buscar una palabra incompleta, que lógicamente no se encontrará, pero la última búsqueda si que tendrá la palabra completa, y debería encontrarla. Yo lo que suelo hacer, y te recomiendo siempre, es que en vez de hacer: .FindFirst "word = ' " & palabra & " ' " Hagas esto Dim Busca as string Busca="word = ' " & palabra & " ' " Debug. Print Busca . FindFirst Busca Esto te da la oportunidad de ver que es lo que se está buscando exactamente. Muchas veces te das la sorpresa. Fíjate bien en que si el dato es numérico debe buscarse una variablle numérica, si comillas, si es una variable de texto debe ir entre comillas simples, y si es una fecha... bueno si es una fecha tienes un bonito problema (mirate la ayuda del método FindFirst para las fechas) Para hacer las cosas bien deberías comprobar si la búsqueda ha tenido éxito. Esto se hace con la propiedad NoMacht Es decir algo así como: if dtwords.Recordset.nomatch then Msgbox "No se ha encontrado:" & palabra else With DBGrid1 .SelBookmarks.Add .Bookmark End With end if Y otra cosa: La instrucción: . SelBookmarks.Add .Bookmark Es un metodo ADD sobre la colección SelBookmarks que representa el conjunto de lineas seleccionadas del Grid. Por lo tanto, si la primera línea del grid estaba seleccionada inicialmente, seguirá estando seleccionada, y además lo estará también la correspondiente al registro actual. Si quieres que la única linea seleccionada en el Grid sea la localizada en la búsqueda, deberás previamente "desseleccionar todas las lineas seleccionadas" esto es borrar toda la colección SelBookmarks. Por ejemplo: With TDBGrid1.SelBookmarks While .Count > 0 .Remove 0 Wend End With On Error Resume Next TDBGrid1. SelBookmarks. Add TDBGrid1. Bookmark El On Error... está para que si no hay ningún registro activo, cosa que ocurrirá si la búsqueda ha fallado o si el recordset está vacío, no salte el error en el ADD