Access & VBA FAQ
| | | |
Indice de temas
Tablas
Consultas
Formularios
Informes
Macros
Módulos
Base de datos
Miscelánea
API
Utilidades
Problemas
Cadenas
Fechas
Todos los temas
Formularios : Autocompletar en cuadros de texto
Autor/es:
Juan M Afán de Ribera
Pregunta : ¿Existe alguna función en Access que haga o simule la utilidad auto completar existente en las celdas de Excel?
Respuesta : En principio, no existe tal cosa en Access. En todo caso, puedes utilizar un cuadro combinado de Access, que sí tiene incorporada esa utilidad.

Si de todas maneras no quieres utilizar un cuadro combinado, puedes utilizar la función que he creado para tal efecto. Hay que tener en cuenta que esta función sólo auto-completará cuadros de texto que estén situados en formularios que tengan datos enlazados a una tabla o consulta. Este cuadro de texto tiene que ser un control independiente, sin datos enlazados.

He escrito dos funciones diferentes: una que servirá para archivos de tipo MDB y otra que servirá para proyectos de tipo ADP. Tal vez se podría haber hecho una sola función, en la cual se comprobara si estamos en un fichero MDB o en un proyecto ADP, pero para ganar velocidad en el código, he preferido separarlo en dos funciones distintas, pues esta función se ejecutará cada vez que se cambie el contenido de un cuadro de texto y vale la pena ahorrarle el mayor número de comparaciones posible.

Esta función debe asociarse al evento Change (Al cambiar) del cuadro de texto, escribiendo en la casilla correspondiente a ese evento en la ventana de propiedades:
= AutoComplete("Nombre_del_Campo")
Donde "Nombre_del_Campo" será el nombre del campo del origen de datos del formulario (tabla o consulta) por el que cuadro de texto buscará.

Copia el código que corresponda al tipo de proyecto que estés usando en un módulo estandar.

Función AutoComplete para ficheros MDB:
'---------------------------------------------------------
' AutoComplete
'
' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     accessvba@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
' función que detecta si una tecla ha sido pulsada
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


Function AutoComplete(FieldName As String)
Dim ctl As Control
Dim LenOldText As Long
Static Once As Boolean
Dim rst As Object
    
    ' Primero comprobamos que la función se ejecute
    ' sólo una vez en cada llamada (esta función cambia
    ' el contenido del cuadro de texto, y por tanto, el
    ' evento Change la llamará dos veces)
    If Once = False Then
        ' comprobamos que no se hayan pulsado las teclas
        ' Retroceso o Suprimir
        If GetAsyncKeyState(vbKeyBack) = 0 _
            And GetAsyncKeyState(vbKeyDelete) = 0 Then
            ' esta variable se pondrá a True mientras
            ' se ejecute la función, para que este código
            ' sólo actualice el cuadro de texto una vez
            Once = True
            On Error Resume Next
            ' referenciamos el control activo
            Set ctl = Screen.ActiveForm.ActiveControl
            ' referenciamos el recordset del formulario
            Set rst = Screen.ActiveForm.RecordsetClone
            If ctl.Text <> "" Then
                ' buscamos el primer registro cuyos primeros caracteres
                ' coincidan con los que contiene el cuadro de texto
                rst.FindFirst FieldName & " LIKE '" & ctl.Text & "*'"
                ' si se han encontrado coincidencias
                If Not rst.NoMatch Then
                    LenOldText = Len(ctl.Text)
                    ' actualizamos el valor del cuadro de texto
                    ctl.Text = rst(FieldName)
                    ' situamos el cursor donde el usuario escribía
                    ctl.SelStart = LenOldText
                    ' seleccionamos el nuevo texto incorporado
                    ctl.SelLength = Len(ctl.Text) - LenOldText
                End If
            End If
            Set ctl = Nothing
            Set rst = Nothing
            On Error GoTo 0
            Once = False
        End If
    End If
    
End Function
'---------------------------------------------------------
Función AutoComplete para ficheros ADP
'---------------------------------------------------------
' AutoComplete
'
' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     accessvba@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
' función que detecta si una tecla ha sido pulsada
Private Declare Function GetAsyncKeyState Lib "user32" _
                (ByVal vKey As Long) As Integer


Function AutoComplete(FieldName As String)
Dim ctl As Control
Dim LenOldText As Long
Static Once As Boolean
Dim rst As Object
    
    ' Primero comprobamos que la función se ejecute
    ' sólo una vez en cada llamada (esta función cambia
    ' el contenido del cuadro de texto, y por tanto, el
    ' evento Change la llamará dos veces)
    If Once = False Then
        ' comprobamos que no se hayan pulsado las teclas
        ' Retroceso o Suprimir
        If GetAsyncKeyState(vbKeyBack) = 0 _
            And GetAsyncKeyState(vbKeyDelete) = 0 Then
            ' esta variable se pondrá a True mientras
            ' se ejecute la función, para que este código
            ' sólo actualice el cuadro de texto una vez
            Once = True
            On Error Resume Next
            ' referenciamos el control activo
            Set ctl = Screen.ActiveForm.ActiveControl
            ' referenciamos el recordset del formulario
            Set rst = Screen.ActiveForm.Recordset.Clone
            If ctl.Text <> "" Then
                ' buscamos el primer registro cuyos primeros caracteres
                ' coincidan con los que contiene el cuadro de texto
                rst.Find FieldName & " LIKE '" & ctl.Text & "*'"
                ' si se han encontrado coincidencias
                If Not rst.EOF Then
                    LenOldText = Len(ctl.Text)
                    ' actualizamos el valor del cuadro de texto
                    ctl.Text = rst(FieldName)
                    ' situamos el cursor donde el usuario escribía
                    ctl.SelStart = LenOldText
                    ' seleccionamos el nuevo texto incorporado
                    ctl.SelLength = Len(ctl.Text) - LenOldText
                End If
            End If
            Set ctl = Nothing
            Set rst = Nothing
            On Error GoTo 0
            Once = False
        End If
    End If
    
End Function
'---------------------------------------------------------

Ejemplos:

 

Temas relacionados:

 

Última actualización: 3/11/2005