Regresar a la Pagina de Inicio

19 sept. 2017

Algo sobre columnas y nombres de rangos

Casi que me da vergüenza escribir esta nueva entrada... ya que lo hago luego de dos años sin aparecer por estos pagos. ¿Excusas? Miles: trabajo, casa, estudio, familia, viajes, mas excusas, mas excusas y mas excusas. La que mas se adapta a la realidad: demasiados cambios y "quilombos" (como decimos en Argentina), pero ahora mas asentado y mejor.
Creo, si todo sale bien, que aunque sea una vez por semana subiré ejemplos con las resoluciones a las consultas mas frecuentes... como estas dos que siguen a continuación:

a) Necesito saber qué función utiliza Excel para determinar la LETRA de una columna.
Bueno, lamento ser el portador de una mala noticia: Excel no posee tal función. Siempre que trabajemos con columnas VBA solo reconocerá números, no letras. Si ejecuto:
    MsgBox ActiveCell.Column
el resultado será:
Es decir: estoy en la columna C y, por lo tanto, el código me devuelve 3 (tercer columna)

Veamos como solucionar este problema. Ahora corramos el siguiente código:
    MsgBox ActiveCell.Address
y obtengo:
No es lo que estamos buscando... pero ya aparece la columna en cuestión: C

Como podrán observar, hay varias "cosas" que molestan: los $ y el número.
Existen varias soluciones posibles, pero en lo personal esta es la que considero mas sencilla: hacer uso de la función Split(Expresión, Delimitador)
Split "divide" una cadena (expresión) en base a un Delimitador que le paso, creando una matriz. Si, suena raro y complicado para quienes no están familiarizados con esta función, pero es mas fácil de lo que parece. Observen:
    M = Split(ActiveCell.Address, "$")
    
Entonces: como primer argumento le paso el Address de la celda (que en este ejemplo es $C$1), y en segundo lugar le paso un "$" para indicarle que "corte" la cadena cada vez que encuentre ese "$". ¿Y cuántos $ hay en parámetro? Si, hay 2. por cuanto en M quedarán guardados C (en la primer posición) y 1, en la segunda.
A nosotros nos interesa solo la primer posición de esa matriz, que contiene la letra que tanto estamos buscando:
  M = Split(ActiveCell.Address, "$")
  MsgBox M(1)
Siendo el resultado final:
Listo.

Ya se que esto "sabe a poco" para quienes nunca usaron Split(expresión, delimitador), así que vamos a un pequeño ejemplo para aclarar dudas y, de paso, aprender esta nueva y extremadamente útil función de VBA.
Supongamos que necesitamos saber la cantidad de palabras que posee una oración, por ejemplo:
"Que bueno es Damian Omar Silva haciendo macros"
Mas allá de tremenda humildad que encierra la frase, los programadores mas estructurados recorrerían toda la cadena en busca de un espacio en blanco y así contarían cada palabra.
Split no ahorrará esa tarea de bucles, x, y, mid(), etc, etc, etc, con este sencillo código:
    M=Split("Que bueno es Damian Omar Silva haciendo macros", " ")
Como primer argumento pasé la frase, y con el segundo (un espacio en blanco) le estoy indicando cual es el "delimitador" y que a partir de él "corte" la frase y la coloque en una matriz, en donde cada posición será una palabra. El código completo queda:
    M=Split("Que bueno es Damian Omar Silva haciendo macros", " ")
    MsgBox UBound(M)
Con UBound obtengo la cantidad de elementos dentro de una matriz. Si ejecuto lo escrito, este es el resultado:

Exacto: la frase contiene 8 palabras divididas por un espacio (recordemos que, por defecto, todas las matrices empiezan con cero: de 0 a 7 = 8 unidades)

Si queremos ver el resultado de cómo se ubicó cada palabra en la matriz, ahora si utilizaremos un bucle recorriendo cada posición de dicha matriz y volcando su valor en una planilla:

Y al final podemos comprender mejor todo:


En el ejemplo con la letra de la columna utilicé el $ como delimitador, en el caso de la humilde frase, el espacio. Y así harán Uds. con los casos que se les presenten de ahora en mas, adecuando los parámetros en función de las necesidades del problema a resolver.

b) Tengo que saber todos los rangos que poseen nombre
Recordemos que a cada rango (sea una sola celda o un conjunto de ellas) se le puede otorgar un nombre en particular, desde la izquierda de la barra de fórmulas o bien yendo a la pestaña Fórmulas/Asignar nombre. No ahondaré mucho en esta cuestión ya que la misma se encuentra detallada en otras entradas de este blog.
Ya sabemos, también, lo fácil y útil que nos resulta trabajar con el rango "Sueldo" en vez de apuntar a la celda "A1", dado que así logramos "setear" rangos con nombres acordes a su función.
En mas de una ocasión necesitamos saber que cantidad de nombres hay definidos en el libro y en donde se encuentran cada uno de ellos (su respectiva celda).
La cuestión ahora es mas sencilla que el ejemplo anterior, dado que Excel (VBA) sí cuenta con objetos que nos permitirán llevar a cabo la labor.
El siguiente código se encuentra detalladamente comentado para ir comprendiendo correctamente cada línea del mismo.
Como observarán, el asunto es bastante fácil: cargo en un objeto (llamado, muy originalmente, "Nombres"), todos los nombres de rango que existen en el libro. Luego con un bucle recorro desde 1 a Nombres.Count (con la propiedad Count obtengo la totalidad de ítems) y los voy colocando en las celdas de la planilla de cálculos creada a tales efectos:
Sub ListarReferencias()

Dim Nombres As Object 'declaro la variable objeto



'la seteo, "cargando" en ella todos los nombres existentes

'en el libro

Set Nombres = ActiveWorkbook.Names

'agrego una hoja nueva para colocar allí la info:

Sheets.Add

'y ahora con un simple bucle recorro todos los ítems

'presentes dentro del objeto Nombres:

For x = 1 To Nombres.Count

    Cells(x, 1).Value = Nombres(x).Name

    Cells(x, 2).Value = Nombres(x).RefersToRange.Name

Next

'como siempre, destruyos los objetos para liberar memoria:

Set Nombres = Nothing

End Sub


Y el resultado:
En la columna A vamos guardando el nombre del rango, con el uso de la propiedad Name. Y en B le colocamos a qué celda está haciendo referencia, con la propiedad RefersToRange.Name

¿Listo? Si, listo.

Bien, trataremos, de ahora en mas, de publicar con un poco mas de frecuencia que una vez cada dos años.
Disculpen si no contesto todos los mensajes, pero realmente no tengo tiempo.
Salu2.xlsm a todos

0 comentarios:

Publicar un comentario

Regresar a la Pagina de Inicio

ENTRADAS MAS RECIENTES (ULTIMAS 10)


las + vistas

10 ULTIMOS COMENTARIOS DE MIS LECTORES

Free counters!
blog de periodismo




GRAFICA RIO BRAVO
Serigrafia-Offset
Rosario - Santa Fe - Argentina
TE: 0341 4664028