miércoles, 31 de mayo de 2017

VBA: La API FoldString o como eliminar tildes

Hoy veremos un uso interesante de la función API de Windows FoldString para conseguir limpiar de tildes y otros signos nuestros textos.

Generaremos una función personalizada o UDF que hace uso de esa API, y así poder emplearla en nuestras celdas...
Para ello abrimos la ventana de código de nuestro módulo estándar y añadimos el siguiente código:

Private Declare Function FoldString Lib "kernel32" Alias "FoldStringA" _
    (ByVal dwMapFlags As Byte, _
    ByVal lpSrcStr As Long, _
    ByVal cchSrc As Long, _
    ByVal lpDestStr As Long, _
    ByVal cchDest As Long) As Long
    
Private Const MAP_COMPOSITE As Long = &H40
'

Function NoTildes(Texto As String) As String
Dim x As Integer
'generamos una cadena con un número de espacio igual al número de caracteres del texto
NoTildes = Space(Len(Texto))

'empleamos una función 'StrPtr' sin documentación
'que suele emplearse en ocasiones en nuestros proyectos de VBA
'cuando usamos ciertas funciones API
'sirven para obtener la dirección de memoria subyacente de las variables.

For x = 0 To (Len(Texto) * 2 - 2) Step 2
    'empleamos la API FoldString con sus cinco argumentos
    FoldString MAP_COMPOSITE, StrPtr(Texto) + x, 1, StrPtr(NoTildes) + x, 1
Next x
  
End Function



El resultado se observa en la imagen:

VBA: La API FoldString o como eliminar tildes



Comprobamos como ha eliminado los signos más frecuentes: tildes, diéresis o la virgulilla de la eñe...

Esta función API de Windows tiene cinco argumentos:
dwMapFlags: tipos de transformación
lpSrcStr: direcciona a la fuente de la cadena
cchSrc: tamaño de la cadena (en bytes o número de caracteres)
lpDestStr: direcciona al destino
cchDest: tamaño del destino (en bytes o número de caracteres).

siendo especialmente relevante el primero de ellos, donde identificamos el tipo de transformación. Pueden ser:
MAP_COMPOSITE: este asigna caracteres acentuados a caracteres compuestos (lo que necesitamos).
MAP_EXPAND_LIGATURES
MAP_FOLDCZONE
MAP_FOLDDIGITS
MAP_PRECOMPOSED

No hay comentarios:

Publicar un comentario