Formulario para buscar en un DataGrid mediante un TextBox y Commandbuttons
El ejemplo para buscar , utiliza el método Find del recordset
Para buscar en el DataGrid, se debe indicar que campo se va a tener en cuenta para la busqueda. Dichos campos se añaden en un control Combobox
Nota: asi como está hecho el ejemplo, solo se puede buscar y especificar un campo que sea de tipo string, si no dará error en el método Find, por ejemplo si se busca en un campo de tipo Numérico
También hay un CheckBox para indicar de que forma buscar, es decir buscar el registro teniendo en cuanta la palabra completa, o parte de la cadena

Código fuente en el formulario
Option Explicit
'***********************************************************************************
' Ejemplo para buscar en un DataGrid con el método Find del recordset
'Controles : 1 - La referencia a Ado _
2 - Un control DataGrid ( DataGRid1 ) _
3 - Un control Textbox (Text1) _
4 - Dos CommandButon ( Command1 y Command2 ) _
5 - Un Combobox ( Combo1 - Para los campos ) _
6 - Un CheckBox _
7 - Indicar en la constante s_CONNECTION_S
TRING la _
cadena de conexión para la base de datos _
8 - Indicar en el FormLoad, la consulta Sql para el recordset
'***********************************************************************************
'***********************************************************************************
' ConnectionStri
ng
Private Const s_CONNECTION_S
TRING As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Archivos de programa" & _
"\Microsoft Visual Studio\VB98\" & _
"NWIND.MDB;Persist Security Info=False"
' Colores de fondo para los textbox mientras se busca
Private Const COLOR_TEXTBOX_
NO_FOUND As Long = &H8080FF
Private Const COLOR_TEXTBOX_
FOUND As Long = &HC0FFFF
Private Const COLOR_TEXTBOX_
NORMAL As Long = vbWhite
'***********************************************************************************
' Variable de tipo Recordset y con evento
Private WithEvents Recordset As ADODB.Recordse
t
'Botón para buscar hacia atrás
Private Sub Command1_Click()
' Si llega al final posiciona el recordset en el último registro
If Recordset.EOF Then
Recordset.Move
Last
End If
' Habilita y deshabilita los command de buscar
If Recordset.BOF Or Recordset.Abso
lutePosition <= 1 Then
Command1.Enabl
ed = False
Command2.Enabl
ed = True
Command2.SetFo
cus
Exit Sub
End If
Dim Anterior As Long
' guarda la posición del Registro anterior
Anterior = Recordset.Abso
lutePosition
' Mueve el cursor
Recordset.Move 0, Recordset.Book
mark - 1
' Busca en cualquier parte de la cadena
If Check1.Value = 0 Then
Recordset.Find Combo1.Text & " LIKE '*" + Text1.Text + "*'", , adSearchBackwa
rd
' Busca la cadena completa
ElseIf Check1.Value = 1 Then
Recordset.Find Combo1.Text & "='" + Text1.Text + "'", , adSearchBackwa
rd
End If
Command2.Enabled = True
' Si llega al principio , selecciona la última fila encontrada
If Recordset.BOF Then
Recordset.Abso
lutePosition = Anterior
Command1.Enabl
ed = False
Command2.SetFo
cus
End If
End Sub
'Botón para buscar hacia adelante
Private Sub Command2_Click()
' Si llega al principio posiciona el recordset en el primer registro
If Recordset.BOF Then
Recordset.Move
First
End If
' Habilita y deshabilita los botones para buscar
If Recordset.EOF Or Recordset.Abso
lutePosition >= Recordset.Reco
rdCount Then
Command2.Enabl
ed = False
Command1.Enabl
ed = True
Command1.SetFo
cus
Exit Sub
End If
Dim Anterior As Long
' Almacena la fila actual
Anterior = Recordset.Abso
lutePosition
' Mueve un registro hacia atrás
Recordset.Move 0, Recordset.Book
mark + 1
' Busca en cualquier parte de la cadena
If Check1.Value = 0 Then
Recordset.Find Combo1.Text & " LIKE '*" + Text1.Text + "*'", , adSearchForwar
d
' Busca la cadena completa
ElseIf Check1.Value = 1 Then
Recordset.Find Combo1.Text & "='" + Text1.Text + "'", , adSearchForwar
d
End If
Command1.Enabled = True
If Recordset.EOF Then
Command2.Enabl
ed = False
Command1.SetFo
cus
Recordset.Abso
lutePosition = Anterior
End If
End Sub
Private Sub Form_Load()
' Variable para la conexión de Ado
Dim db As ADODB.Connecti
on
' Nuevo objeto Connection
Set db = New ADODB.Connecti
on
db.CursorLocation = adUseClient
' Abre la base de datos pasando la cadena de conexión
db.Open s_CONNECTION_S
TRING
' crea un Recordset
Set Recordset = New Recordset
' Abre el Recordset con la consulta Sql
Recordset.Open "Select [NombreContacto]," & _
"[NombreCompañía]," & _
"[CargoContacto] " & _
"From Proveedores Order By NombreContacto Asc", _
db, adOpenStatic, adLockOptimist
ic
Dim i As Integer
'Recorre los campos del recordset para añadirlos al combobox
'Nota: los campos deben ser de tipo String
For i = 0 To Recordset.Fiel
ds.Count - 1
Combo1.AddItem Recordset.Fiel
ds.Item(i).Name
Next i
' Selecciona el campo 1
Combo1.ListIndex = 0
' Engancha el recordset al datagrid
Set DataGrid1.Data
Source = Recordset
' Opcional . esto hace que se seleccione la fila completa en el DataGrid
DataGrid1.MarqueeStyle = dbgHighlightRo
wRaiseCell
Text1 = ""
'caption de los controles
Command1.Caption = "Quitar Filtro"
Command1.Caption = " << Buscar Anterior "
Command2.Caption = " Buscar Siguiente >> "
Check1.Caption = " Buscar palabra completa"
End Sub
Private Sub Text1_Change()
If Text1 <> "" Then
' Habilita los botones para buscar hacia atrás y hacia adelante
Command1.Enabled = True
Command2.Enabled = True
Dim Actual As Long
' almacena la fila actual, por si no so se encontró vuelve a posicionar _
el recordset en dicha fila
If Not Recordset.EOF And Not Recordset.BOF Then
Actual = Recordset.Abso
lutePosition
End If
' Busca en cualquier parte de la cadena
If Check1.Value = 0 Then
Recordset.Find Combo1.Text & " LIKE '*" & Text1.Text & "*'", , adSearchForwar
d
' Busca la Cadena completa
ElseIf Check1.Value = 1 Then
Recordset.Find Combo1.Text & "='" & Text1.Text & "'", , adSearchForwar
d
End If
' Color del fondo del textbox
If Not Recordset.EOF And Not Recordset.BOF Then
Text1.BackColor = COLOR_TEXTBOX_
FOUND
Else
Text1.BackColor = COLOR_TEXTBOX_
NO_FOUND
End If
If Recordset.BOF Or Recordset.EOF Then
Recordset.AbsolutePosition = Actual
End If
' Si el textbox está vacío, posiciona el recordset en el primer registro
Else
Command1.Enabled = False
Command2.Enabled = False
Recordset.MoveFirst
Set DataGrid1.Data
Source = Recordset
' Color de fondo del textbox cuando está vacío
Text1.BackColor = COLOR_TEXTBOX_
NORMAL
End If
End Sub
' Evento que se dispara cuando se cambia de posición en el recordset
Private Sub Recordset_Move
Complete(ByVal adReason As ADODB.EventRea
sonEnum, _
ByVal pError As ADODB.Error, adStatus As ADODB.EventSta
tusEnum, _
ByVal pRecordset As ADODB.Recordse
t)
' Muestra en el caption del formulario el número registro actual
Me.Caption = " Registro actual: " & CStr(Recordset.Abso
lutePosition)
End Sub
' Cuando se produce un error en el recordset se dispara este evento
Private Sub Recordset_Erro
r(ByVal ErrorNumber As Long, Description As String, _
ByVal Scode As Long, ByVal Source As String, _
ByVal HelpFile As String, ByVal HelpContext As Long, _
fCancelDisplay As Boolean)
' Mostramos el error
MsgBox " Descripción del Error :" & Description, vbCritical
End Sub
' Cierra el recordset y Descarga la referencia
Private Sub Form_Unload(Cancel As Integer)
' Cierra
If Recordset.Stat
e = adStateOpen Then
Recordset.Close
End If
' descarga
If Not Recordset Is Nothing Then
Set Recordset = Nothing
End If
End Sub
espero que te sirva de algo-
