En la entrada anterior vimos la forma de extraer solo los caracteres numéricos de una cadena alfanumérica: por ejemplo, si tengo el código WERT657, hacer que funciones me devuelvan solamente WERT. Si revisan dicho post, verán una complicada anidación de funciones, y que realmente no resuelve todos los problemas que se nos pueden plantear. Pero dejesmolo ahí... el ejemplo en cuestión funciona para lo solicitado por mi lector.
[+/-] Ver el resto / OcultarEl tema es que con una sencillísima UDF (funcion definida por el usuario) podemos desde VBA solucionar el mismo planteamiento, sin la necesidad de recurrir a complejas funciones matriciales y sus siempre presentes funciones anidadas. Entiendo que muchas veces algunas PC tienen el uso de macros restringido, pero si podemos hacer uso de ellas.... la tarea se nos aliviará enormemente.
Nos vamos al Editor de Visual Basic (Alt + F11), menú Insertar / Módulo, y dentro de él escribimos el siguiente código:
Así como está funciona... pero y que pasa con la bendita "ñ"? Como estamos en VBA, un simple IF.. mas soluciona la cuestión:
Brindando la solución:
Consideraciones generales: si deseamos ingresar la letra ñ en una celda, bastará com presionar Alt y luego tipear 164. Pero noten que en mi código identifico a dicha letra con el código 241. VBA no reconoce a la ñ como Alt + 164, y me ha llegado a provocar mas de un problema, dependiendo de la aplicación para la cual estoy programando. En todo caso, bastará la incorporación de una pequeña linea de código para saber en donde estamos parados:
Tal lo expuesto hasta el momento, la utilización de funciones definidas por el usuario (UDF), creadas desde VBA, pueden ayudarnos y facilitar mucho nuestra tarea diaria.
Nos vamos al Editor de Visual Basic (Alt + F11), menú Insertar / Módulo, y dentro de él escribimos el siguiente código:
Function CaracteresAlfabeticos(x As Variant) 'declaro las variables de uso local Dim Largo, J As Integer Dim Cadena, Letra As String 'calculo el largo de la cadena a tratar, aplicandole 'primero a Trim(), para quitar cualquier espacio en 'blanco al principio y al final: Largo = Len(Trim(x)) 'con un bucle recorro cada uno de los caracteres de 'la cadena pasada como argumento (x) For J = 1 To Largo 'con Mid() individualizo cada caracter: Letra = Mid(x, J, 1) 'ahora pregunto: si el número Ascci de esa Letra (en 'mayúsculas) está entre 65 (A) y 90 (Z), lo concateno 'a la variable Cadena, para ir armando el código: If Asc(UCase(Letra)) >= 65 And Asc(UCase(Letra)) <= 90 Then Cadena = Cadena & Letra End If Next J 'devuelvo el resultado obtenido: CaracteresAlfabeticos = Cadena End Function
Este código nos devuelve los siguientes resultados, una vez que ingresamos la función en una celda tal cual lo haríamos como con cualquiera de las que ya vienen incorporadas en Excel:
desde B1 a B3 ingresé la función creada, que toma los valores presentes en A1:A3, extrayendo solo aquelos caracteres que son letras.
Así como está funciona... pero y que pasa con la bendita "ñ"? Como estamos en VBA, un simple IF.. mas soluciona la cuestión:
Function CaracteresAlfabeticos(x As Variant) 'declaro las variables de uso local Dim Largo, J As Integer Dim Cadena, Letra As String 'calculo el largo de la cadena a tratar, aplicandole 'primero a Trim(), para quitar cualquier espacio en 'blanco al principio y al final: Largo = Len(Trim(x)) 'con un bucle recorro cada uno de los caracteres de 'la cadena pasada como argumento (x) For J = 1 To Largo 'con Mid() individualizo cada caracter: Letra = Mid(x, J, 1) 'ahora pregunto: si el número Ascci de esa Letra (en 'mayúsculas) está entre 65 (A) y 90 (Z), lo concateno 'a la variable Cadena, para ir armando el código: If Asc(UCase(Letra)) >= 65 And Asc(UCase(Letra)) <= 90 Then Cadena = Cadena & Letra 'aqui agrego a nuestra castellana letra: ElseIf Asc(LCase(Letra)) = 241 Then Cadena = Cadena & Letra End If Next J 'devuelvo el resultado obtenido: CaracteresAlfabeticos = Cadena End Function
Brindando la solución:
Dim Letra_ñ As Byte Letra_ñ = Asc("ñ") If Letra_ñ = 241 Then 'instrucciones ElseIf Letra_ñ = 164 Then 'instrucciones End If
Tal lo expuesto hasta el momento, la utilización de funciones definidas por el usuario (UDF), creadas desde VBA, pueden ayudarnos y facilitar mucho nuestra tarea diaria.
en codigo VBA, como le puedo hacer para identificar una serie de letras y numeros entre si, si estos vienen de un TXT, separados por un espacio,
ResponderEliminarcorreo jorgeacalderon.88@gmail.com
hola jorge: me llegó un mail tuyo a mi correo. te lo respondí, solicitandote que (si te es posible) me envíes unas líneas de ese archivo junto a una explicación un poco mas detallada. se pueden lograr muy buenos trabajos con los txt, y hay muchas formas de hacerlo.
ResponderEliminarquedo al aguardo de tus novedades, así armo una entrada con tu consulta y puedo ayudarte correctamente. un abrazo y gracias x tu mensaje