Ir al contenido principal

acomodar datos segun el mes de una celda

Si bien a mi lector le prometí una cosa... voy a terminar haciendo otra. Pero bueno, es una de las tantas soluciones posibles. Lamentablemente hacer este trabajo (lo prometo para mas adelante) con funciones torna a Excel demasiado lento y es, a la vez, una tarea bastante compleja. Así que me decidí por mis queridas macros.

El planteamiento es el siguiente: hay una tabla con dos columnas: nombre y fecha de cumpleaños. Cada vez que se ingrese una fecha, Excel deberá encargarse, automáticamente, de enviar el nombre de la persona a otra hoja, en una columna que coincida con el mes de su cumpleaños.
Las imágenes a continuación, para entender mejor un poco todo esto:
nombre y fecha de cumpleaños, respectivamente.

Sobre la base de los datos de la tabla anterior, nuestra macro deberá llevarse el nombre de la persona a otra tabla, y colocarlo en el mes que corresponda a su cumpleaños:
cada uno de los nombres, distribuidos según el mes de su natalicio. (fahh, que palabra me mandé...)

La macro es muy sencilla y solo consta de un par de estructuras If...Else...End If. Como principal medida, y para evitar errores, voy a validar los datos de la columna B, para que solo acepte fechas:
solo se aceptarán fechas mayores al primero de enero de 1900.

Para aprovechar las herramientas como corresponde, ubicaré el código VBA dentro de la ventana correspondiente al objeto Worksheet, utilizando el evento Worksheet_Change (al cambiar). Se disparará la macro cada vez que se produzca algún cambio en la hoja.


Sigamos. La fecha se deberá ingresar en la columna B, siendo los pasos a seguir (mas o menos) los que detallo a continuación:
a) Si la columna es B (la número 2)
b) Si la fila es mayor a 1 (en la primer fila tenemos los encabezados)
c) Si el dato ingresado es fecha
d) Me llevo el nombre de la persona a la otra tabla.

Y ahora se explica bien por qué efectué la validación de datos: voy a tomar el número del mes para saber en que columna de la otra tabla colocaré el nombre. Enero irá en la columna 1, Febrero en la 2, Marzo en la 3 y así sucesivamente. Les muestro el código, correctamente comentado para una mejor interpretación (recordemos que el argumento "target" es la celda o rango que sufre la modificación):

Private Sub Worksheet_Change(ByVal Target As Range)
'variables de uso local
Dim Mes As Byte
Dim Fila As Long

'si la columna de la celda cuyo contenido cambia es la 2 (B)
If Target.Column = 2 Then
    'si la fila de dicha celda es mayor a 1
    If Target.Row > 1 Then
        'si el dato ingresado NO es fecha
        If Not IsDate(Target.Value) Then
            'salgo del sub
            Exit Sub
        'si el dato es fecha
        ElseIf IsDate(Target.Value) Then
            'tomo el mes de la fecha y lo almaceno en una variable
            Mes = Month(Target.Value)
            'veo cual es la última fila ocupada de esa columna en la otra tabla,
            'y le sumo 1, para colocar el dato debajo:
            Fila = Sheets("cumpleaños").Cells(65536, Mes).End(xlUp).Row + 1
            'y aquí llevo el nombre de la persona a la otra hoja: uso las variables
            'Fila y Mes para crear la coordenadas y colocar el nombre en la celda
            'correcta
            Sheets("cumpleaños").Cells(Fila, Mes).Value = Cells(Target.Row, (Target.Column - 1))
        End If
    End If
End If
End Sub

Podrán encontrar todo el ejemplo bajando este archivo.
Dentro de unos días subiré la solución con funciones, cuando tenga un poco mas de tiempo y solucione algunas cuestiones que, considero, son bastantes complejas y detallarlas solo aburriría. Lo corto y bueno, dos veces bueno.
Gracias lector por tu consulta y cualquier duda me avisas.

Comentarios

  1. MUY BUENA SOLUCION, GRACIAS POR EL APORTE ESTUDIARE EL CODIGO.

    ResponderEliminar
  2. gracias Lima, espero que te sea de utilidad y cualquier problema no dudes en consultar.
    un abrazo.

    ResponderEliminar

Publicar un comentario

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