Ir al contenido principal

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

Comentarios

Entradas populares de este blog

funciones: convertir numeros a letras con excel

En realidad hace tiempo que vienen consultándome sobre esto... quizás cinco o seis años . Debe ser una de las funciones mas buscadas de Excel, por lejos: la posibilidad de escribir: 1.534,63 y que en una celda aparezca magicamente "un mil quinientos treinta y cuatro c/15/100". Aquí les dejo una solución, basada en funciones , sin utilizar macros, la cual preparé exclusivamente para este Blog. A pesar de los millones de usuarios que requieren esta herramienta, no viene incorporada en Excel, debemos armarla nosotros mismos .  Luego de la imagen irá la explicación de como llegué a lograr esto, dado que es un proceso medianamente complejo , que utiliza tres o cuatro funciones básicas y requiere de varios pasos. así quedará nuestra planilla y siempre devolverá en letras el valor que ingresemos en A1 [+/-] Ver el resto / Ocultar Desde ya aclaro: esta no es " la forma " de hacerlo, simplemente es una mas, evitando el uso de macros. Sobre esta base, comencemos: 1) El núme

macros: como enviar mails desde Excel (vba)

Un gran amigo "on-line", Johan Moreno, de Colombia , me hizo llegar la inquietud de cómo enviar mails desde Excel . Si bien contaba con algunas líneas de código sobre el particular, decidí retomar mi ejemplo y adaptarlo mejor a las circunstancias. Hace unos minutos termino de remitirle un correo con la solución a Johan... desde Excel y con un archivo adjunto, mismo que transcribo a continuación para ayudar a todos con esta tarea. Veamos primero las dos formas principales de enviar mails: mediante Outlook o nuestro Web Mail ( yahoo, gmail, hotmail, etc, etc ) No soy usuario de Outlook en lo absoluto: no confío en los agujeros de seguridad que continuamente aparecen y, por otro lado, t eniendo a mi alcance una herramienta tan poderosa (y gratuita) como Gmail, la cual ahora también permite sincronizar los mensaje con la Pc para verlos offline (deben activarlo en "google labs") ... no creo que me haga usuario ni hoy ni mañana. Igualmente mas adelante daré una solució

buscarv con varios resultados

Es de las preguntas mas recurrentes que he tenido: ¿se puede lograr que la función BUSCARV() devuelva varios resultados? Si recordamos el uso de esta función, sabremos que la misma buscar en valor en el rango especificado, retornando un solo resultado. Si en la tabla tenermos varios registros iguales BUSCARV() solo nos devolverá el primero de ellos, omitiendo el resto. Entonces ¿se puede? Bueno, aplicando otra técnica sencilla que se me ocurrió al intentar solucionar el planteamiento de un lector... si, puedo hacerlo.... pero sin usar BUSCARV(). la idea es que coloquemos en E1 el código del producto a buscar y a partir de E2 nos devuelva todas las coincidencias de la tabla. [+/-] Ver el resto / Ocultar Vamos a necesitar una columna "auxiliar" para llevar a buen término este proyecto. Con macros el tema sería mas sencillo, pero aquí la cuestión es resolverlo con las funciones de Excel, sin VBA. Paso a paso: Como primer medida chequeamos que valores de la columna A coincide co