martes, 8 de diciembre de 2015

VBA: Una función para extraer caracteres de texto de un valor alfanumérico.

Un caso frecuente es querer trabajar únicamente con los caracteres de texto dentro de una cadena alfanumérica.
Por este motivo hoy veremos una sencilla UDF en VBA para Excel que nos permitirá extraer las letras de nuestra celda, dejando al lado los valores numéricos.
Hola tengo una duda existe formula para separar letras de números cuando estas están en una celda como por ejemplo "100:129-145S" y q solo me salga "S" pero la siguiente celda q la sigue es "100:129-13XL" y como hacer q me salga "XL".
Ya que use una formula =EXTRAE(B4;HALLAR("-";B4;1)+1;1) Pero solo me funciona para la primera celda y no para la segunda.


En el caso propuesto por el lector tenemos un pequeño 'handicap' añadido, y es que contamos con dos caracteres tipo texto(: y -) que no queremos extraer, y tendremos que evitar...

VBA: Una función para extraer caracteres de texto de un valor alfanumérico.



Insertamos nuestro simple procedimiento Function en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:

Function ExtraeTexto(celda As Range) As String
Dim txt As String

'recorremos cada caracter
For i = 1 To Len(celda.Value)
    'evaluamos si NO es numérico
    If Not IsNumeric(Mid(celda.Value, i, 1)) And _
        Mid(celda.Value, i, 1) <> ":" And _
        Mid(celda.Value, i, 1) <> "-" Then
        'en caso afirmativo (NO numérico) concatenamos con resultados anteriores...
        txt = txt & Mid(celda.Value, i, 1)
    End If
Next
'finalmente devolvemos los caracteres textuales...
ExtraeTexto = txt
End Function



Adicionalmente a la solución propuesta podemos obtener lo mismo empleando la función SUSTITUIR anidada sobre sí misma tantas veces como la necesitemos.
En un primer paso 'eliminaremos los caracteres de texto no deseados (: y -), en la celda E2:E3:
=SUSTITUIR(SUSTITUIR(A2;":";"");"-";"")

Para luego construir una función algo larga con 10 funciones SUSTITUIR anidadas entres sí (una por cada número 0-9), aplicada sobre las celdas anteriores E2 y E3:
=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(E2;0;"");1;"");2;"");3;"");4;"");5;"");6;"");7;"");8;"");9;"")
Larga pero eficiente ;-)


Una segunda alternativa más técnica de nuestra función personalizada 'ExtraeTexto' vendría del uso del operador Like:
Function ExtraeTexto2(celda As Range) As String
Dim txt As String

'recorremos cada caracter
For i = 1 To Len(celda.Value)
    'evaluamos si está entre A y Z
    If Mid(celda.Value, i, 1) Like "[A-Z]" Then
        'en caso afirmativo concatenamos con resultados anteriores...
        txt = txt & Mid(celda.Value, i, 1)
    End If
Next
'finalmente devolvemos los caracteres textuales...
ExtraeTexto2 = txt
End Function



Fijémonos en la comparativa realizada:
Like "[A-Z]"
y como al probar la función deja automáticamente fuera los caracteres no deseados : y -

Es importante saber que por defecto está predefinido como método de comparación de cadenas la instrucción: Option Compare Binary; esto significa para nuestro ejemplo que nuestro intervalo de letras [A-Z] entiende y compara con A, B, C, D .. Z.

Para una coincidencia más concreta deberíamos haber empleado y definido al inicio de nuestro módulo la opción:
Option Compare Text, donde el intervalo [A-Z] buscaría coincidencias entre con A, a, À, à, B, b, C, c, D, d, E,e, etcétera.

No hay comentarios:

Publicar un comentario en la entrada