Hace unas semanas un lector me solicitó una macro para poder extraer de una cadena alfanumérica, por un lado los números y por otro los caracteres alfabéticos.

En su momento ya le envíe el código, pero lo tenía pendiente para subir y comentar al resto de la comunidad, creo que es un ejercicio muy interesante y además, de todo lo que he visto y leído no he encontrado nada que realizase el mismo trabajo. En algunos casos (las fórmulas) no completan la totalidad de los casos y las macros «cascaban» cuando pasabas por sus variables números de más de 15 cifras (desbordamiento).

Pues bien, el código que os propongo soluciona perfectamente ambas circunstancias. Veamos el ejemplo de una cadena alfanumérica y los datos que queremos extraer:

EXTRAER NUMEROS Y LETRAS

En este ejemplo, obtenemos a partir de la cadena alfanumérica «ALFANUM», la totalidad de caracteres numéricos (en la columna «NUM») y la totalidad de caracteres alfabéticos (en la columna «ALFA»). Este ejercicio que parece sencillo, es bastante complejo. Por una parte, si nos basamos en fórmulas, se complica bastante cuando los datos números no son consecutivos y por otra, con programación, debemos echar mano del ingenio para automatizar el proceso a partir de una función personalizada.

El código de la función que vamos a utilizar es el siguiente:

Public Function Numeros(Micelda As String)
With Sheets(1)
Dim i As Double, j As Double
Dim num As Variant
'lo que vamos a hacer es realizar un bucle for next dentro de la celda,
'de forma que vaya acumulando los valores numéricos en la variable "num"
For i = Len(Micelda) To 1 Step -1
If IsNumeric(Mid(Micelda, i, 1)) Then
j = j + 1
num = Mid(Micelda, i, 1) & num
End If
If j = 1 Then num = (Mid(num, 1, 1))
Next i
Numeros = (num)
End With
End Function

Así, con esta función podremos realizar la operación directamente en la hoja, como si se tratase de una fórmula. Un dato importante, es que debemos definir la variable «num» como variant, dado que si la definimos como interger, dará un error por desbordamiento según la cantidad de números que le pasemos y si usamos una double, el problema es que a partir de los 15 números, la variable devolverá valor «0» para los siguientes. Por lo tanto, el truco es escoger variant y será Excel el que se encargue de encontrar el método adecuado para mostrar todos los datos.

Ahora que tenemos la función ya construida, nos queda otra parte del código para finalizar la automatización, dado que lo normal es que no tengamos solo una celda para extraer la información, sino toda una columna de datos, en el ejemplo pongo 100 líneas. Para eso necesitamos incluir en el mismo módulo esta macro:

Sub extrae_num()
'Realizamos otro bucle for next para recorrer todas las fichas llamando a la función "Numeros"
'de forma que extraiga las letras hasta el final
Dim c As Double
With Sheets(1)
fin = Application.CountA(.Range("A:A"))
For c = 2 To fin
.Cells(c, 2) = Numeros(.Cells(c, 1))
.Cells(c, 2).NumberFormat = "@"
Next
End With
End Sub

Como podéis observar, tan solo se trata de un bucle que llama a la función «numeros» por cada línea que va recorriendo.

Con el ejemplo anterior se consiguen extraer todos los números:

EXTRAER NUMEROS Y LETRAS_1

Para realizar la misma operación, pero con letras, debemos realizar unos pequeños ajustes en la función, en primer lugar vamos a utilizar una variable acorde a los datos que vamos a extraer (string) y por otra parte, vamos realizar el condicional con aquellos datos que no son numéricos «if not isnumeric».

Public Function Letras(Micelda As String)
With Sheets(1)
Dim i As Double, j As Double
Dim letr As String
'lo que vamos a hacer es realizar un bucle for next dentro de la celda,
'de forma que vaya acumulando los valores NO numéricos en la variable "letr"
For i = Len(Micelda) To 1 Step -1
If Not IsNumeric(Mid(Micelda, i, 1)) Then
j = j + 1
letr = Mid(Micelda, i, 1) & letr
End If
If j = 1 Then num = (Mid(letr, 1, 1))
Next i
Letras = (letr)
End With
End Function

Y la macro será prácticamente idéntica a la utilizada para los números:

Sub extrae_letr()
'Realizamos otro bucle for next para recorrer todas las fichas llamando a la función "Letras"
'de forma que extraiga las letras hasta el final
Dim c As Double
With Sheets(1)
fin = Application.CountA(.Range("A:A"))
For c = 2 To fin
.Cells(c, 3) = Letras(.Cells(c, 1))
.Cells(c, 3).NumberFormat = "@"
Next
End With

Y ahora ya podemos ejecutar los dos códigos:

EXTRAER NUMEROS Y LETRAS_2

Si os habéis fijado, los números que extraemos, los formateamos como texto, esto lo hago así para tener en cuenta los ceros al principio de la cadena, dado que de otra forma, Excel los eliminaría.

Pues este ha sido el ejercicio de hoy. Espero que os haya gustado y sobre todo, que lo podáis poner en práctica.

Descarga el archivo de ejemplo pulsando en: EXTRAER NUMEROS Y TEXTO DE UNA CADENA DE DATOS ALFANUMERICA

 

Comparte este post