Con Acentos

 Principal Novedades Utilidades Código Enlaces Access Acerca de mí

     
 
Principal
Arriba

 

 

 

 

 

 

 

 

 

 

 

 

 

   Instalación Código Descarga

Con Acentos

Módulo para realiza búsquedas con independencia de la acentuación. Lo mismo encuentra Fernández que Fernandez. Llamando a la función desde una macro de teclado funciona en cualquier formulario, subformulario u hoja de datos. Puedes usarlo como una librería, registrándolo en "Referencias", o importar módulo y macro.

Instalación

La forma más sencilla de usarlo es marcarlo como "Referencia" en el diseño del Módulo, en el Menú "Herramientas".

A partir de ese momento, podemos llamar desde donde queramos a la funcion busca(repite), donde repite tiene valor verdadero o falso, indicando si es nueva búsqueda (true) o repetimos la anterior (false)

Si importamos desde "Conacentos" la macro "AsignarTeclas" las teclas de función F3 y Mayúsculas+F3 se encargarán de llamar a la función busca(0) y busca(-1) con sólo pulsarlas en cualquier formulario, subformulario u hoja de datos.

Código comentado

Comentaremos sólo las funciones más interesantes.

Se plantean las siguientes cuestiones:

Cómo hacer que Access busque texto con independencia de los acentos.

Es fácil, utilizamos el operador Like con corchetes "[]".

La siguiente función sustituye cualquier cadena de texto por otra donde hemos sustituido cada vocal por unos corchetes con las distintas posibilidades de acentuación de esa vocal. Por ejemplo "o" lo sustituimos por "oóòöô0"; nótese que también hemos metido el cero, que suele confundirse, de manera que lo mismo podríamos hacer con cualquier letra con cualquier posible confusión.

 

 

Function Buscaacent(X)

Dim i As Variant, A As Integer, l As Integer, busc As Variant

Static letras(5) As Variant

l = Len(X)

busc = X

A = 1

letras(1) = "AÁÀÂÄ"

letras(2) = "EÉÈÊË"

letras(3) = "IÍÌÎÏ"

letras(4) = "OÓÒÔÖ0"

letras(5) = "UÚÙÛÜ"

While A <= l

letra = Mid(busc, A, 1)

For Each i In letras

vocal = InStr(1, i, letra, 1)

If vocal > 0 Then

nuevaletra = "[" & i & "]"

busc = Left(busc, A - 1) & nuevaletra & Right(busc, l_ - A)

A = A + 1 + Len(i)

l = l + 1 + Len(i)

Exit For

End If

Next

A = A + 1

Wend

If busc = "" Then

Buscaacent = X

Else

Buscaacent = busc

End If

' J.Bengoechea

End Function

 

 

Cómo saber en qué campo tenemos que buscar.

En formularios y subformularios usaremos Screen.ActiveControl.Name para saber el nombre del campo, pero luego, para referirnos a él tendremos que hacerlo dentro de un Form o SubForm y necesitamos saber cuales son.

En una hoja de datos el nombre del campo lo sabremos con Screen.ActiveDatasheet.Form.ActiveControl.Name, pero debemos cerciorarnos primero de que hay un Datasheet abierto o nos dará un error.

La función Fbusca localiza si estamos en un Datasheet, un formulario o un subformulario y realiza distintas acciones dependiendo de ello para buscar el en RecordsetClone correspondiente y situarnos en el registro correspondiente. No la incluimos aquí porque hace llamadas a otras funciones y, por eso, es más fácil de seguir en la misma base de datos.

Cómo saber si nos encontramos en un formulario, subformulario u hoja de datos.

Lo de la hoja de datos es fácil, la función AbiertoDatasheet trata de abrir un objeto en el Screen.ActiveDatasheet y si da un error es que no hay hoja de datos abierta.

 

Public Function AbiertoDatasheet () As Boolean

On Error GoTo ErrAbierto

AbiertoDatasheet = False

Dim Ff As Form

Set Ff = Screen.ActiveDatasheet.Form

 

AbiertoDatasheet = True

Exit Function

ErrAbierto:

Resume adiós

adiós:

End Function

 

 

 Screen.Activeform.name nos da el nombre del formulario activo, pero si estamos buscando en un Subformulario, el formulario activo sigue siendo el principal. Debemos, pues, averiguar en primer lugar si estamos en un subformulario y, en tal caso, el nombre del objeto que lo contiene.

El procedimiento SubFrmActivo asciende desde el control activo buscando el .parent hasta encontrar uno que sea tipo formulario o subformulario y si es subformulario devuelve el nombre de éste y el del control que lo contiene.

 

 

Sub SubFrmActivo(Subf, cont)

Dim micontrol As Control, vale As Boolean, Ctrl As Control, miform As String

vale = False

miform = Screen.ActiveForm.Name

Set micontrol = Screen.ActiveControl

Set Ctrl = Screen.ActiveControl

While Not vale

        If EsFrmAbierto(micontrol.Parent.Name) Then

            vale = True

        Else

         

            If Left(UCase(TypeName(micontrol.Parent)), 4) = "FORM_" Or Left(UCase(TypeName(micontrol.Parent)), 5) = "IFORM" Then

                'ES un subformulario

                Subf = micontrol.Parent.Name

                vale = True

            Else

                Set micontrol = micontrol.Parent

            End If

        End If

Wend

'Después de que hemos comprobado si el control activo está 'en un subformulario, recorremos el formulario 'principal 'buscando el control que contiene el subformulario

 

If Subf <> "" Then

For Each Ctrl In Forms(miform).Controls

If TypeName(Ctrl) = "SubForm" Then

If Ctrl.SourceObject = Subf Then

Subf = Ctrl.Name

Exit For

End If

End If

Next

End If

 

cont = micontrol.Name

' J.Bengoechea

End Sub

 

 

 

 

Descarga:

Descargar archivo .MDB

Descargar archivo .MDE

Descargar Módulo Visual Basic

 

Atrás ] Principal ] Arriba ] Siguiente ]

 

J.Bengoechea, 01/03/06