Mostrando entradas con la etiqueta Macros. Mostrar todas las entradas
Mostrando entradas con la etiqueta Macros. Mostrar todas las entradas

jueves, 4 de diciembre de 2014

Como aprovechar datos extraídos de Bloomberg con una Macros

El objetivo de este artículo es desarrollar una Macro en Excel, mediante la cual podamos ordenar y dar formato a series de datos extraídas desde Bloomberg, además incluiremos algunas estadísticas descriptivas básicas. Para el desarrollo de nuestra Macro, utilizaremos los precios históricos diarios del Petroleo Crudo, para el último año, cuyo código en bloomberg corresponde a CL1 COMB Comdty.


Esta Macro será útil para administrar los datos de cualquier serie extraída desde Bloomberg, ahorrando tiempo y esfuerzo a sus usuarios


http://youtu.be/sfzviEj6LZc

Autores:

Luis Marquez Moreno
Gonzalo Marquez Moreno
Daniela San Juan Gómez
Leer más...

martes, 18 de noviembre de 2014

Optimización: Asignación del personal de Auspicio en la Ciclorecreovía

La asignación de recursos es un tema complejo en las organizaciones que muchas veces se realiza a mano, dejando de lado tareas estratégicas o de control. Se ignora el potencial de las herramientas de control. Cosas tan simples como un Excel puden ayudar en gran medida.
En este caso aplicamos Excel para resolver la asignación de personal de auspicio en los puntos estratégicos de la empresa CicloRecreoVía.
El funcionamiento de las macros, matriciales y OpenSolver utilizados en este proceso se muestran en el video a continuación.
La utilización de estas herramientas permitidas por solver pueden verse en otras entradas del


Hecho por:
Héctor Barros
Juan José Torres
Leer más...

viernes, 20 de junio de 2014

Crear Macros en Access

En este vídeo tutorial, describiremos paso a paso cómo crear una macro en versiones de Access actuales (a partir del año 2010). En primer lugar, es importante saber qué son las macros, y para qué sirven.

Las macros son un conjunto de instrucciones programadas digitalmente, las cuales automatizan operaciones, eliminando así tareas repetitivas y realizando cálculos complejos en un corto espacio de tiempo y con una nula probabilidad de error.

Dentro de las acciones de macros en Access más utilizadas, se encuentran: 
  • Abrir distintos objetos, tales como, consultas, formularios, informes, tablas
  • Buscar un registro
  • Mostrar cuadros de mensaje para interactuar con el usuario
  • Aplicar filtros a formularios e informes
  • Actualizar información de las consultas

El generador de macros en Access se encuentra en la pestaña "Crear", donde se encuentra una lista despegable con todas las acciones disponibles. Nos parece importante destacar que Access diferencia aquellos comandos confiables de los que no, en la lista despegable mencionada anteriormente se muestran sólo las de confianza. Si se quiere habilitar todas las acciones disponibles, debemos ir a "Diseño" y seleccionar la opción "Mostrar todas las acciones" en las herramientas de macros.

Caso práctico
A modo de ejemplo, desarrollaremos una macro que imprima una consulta. Para esto utilizaremos una base de datos de una empresa de alimentos que registra sus pedidos de todo el mundo.




Link de interés:
Conceptos básicos de las Macros en Access
Curso Access 2010
Vídeo tutorial office

Autores:
Carolina Atensio
Sofía Diez de Medina
Claudia Salinas
Leer más...

viernes, 24 de enero de 2014

Ingreso De Existencias en Bodegas

           Ingreso De Existencias en Bodegas

 Muchas veces, existen empresas en donde los registros de los productos que ingresan se hacen de forma manual, es más, hay veces que se registran en libros de papel, en vez de utilizar las tecnologías para facilitar su identificación. Hay veces, en donde existen varias bodegas, por lo que cada bodega tiene que tener su propio registro.

 Me puse en el caso, en donde se recibe la mercadería y hay que asignarle una bodega para poder guardar los productos. Para esto, he creado un tablero, una macro que permita crear un registro de inventario. Se puede observar en la siguiente imagen:



 En este tablero, se debe indicar la bodega, el tipo de producto, e indicar el producto específico de acuerdo al tipo de producto. Además se debe indicar la cantidad ingresada y el número de factura. Luego de haber llenado estos datos, se procede a “Guardar”.

 Primero que todo cada producto tiene asociado un precio y cada registro se va guardando en la bodega correspondiente. Al apretar el botón “Guardar”, se crea un registro en una hoja con el nombre de cada bodega, en este caso existen 3, Los Leones, Irarrázaval y Quilicura.

 Por ejemplo hay un ingreso de mercaderías a la bodega de Quilicura, el tipo de productos es “Artículos”, abro la lista desplegable y tengo la opción de ingresar “Chasis” o “Negatoscopios”, elijo “Chasis”. La cantidad (3) y el número de la factura (56). Ahora pongo “Guardar” y me entrega el siguiente registro:



  Me entrega automáticamente el Costo total de los productos, la fecha de ingreso, y me crea un ID de registro, que es único por Bodega. Luego, si quiero hacer otro registro, se va poniendo bajo el registro anterior.





Los códigos de la Macro son los siguientes:

Sub guardar()

Application.ScreenUpdating = False
Sheets("Los Leones").Unprotect
Sheets("Irarrazaval").Unprotect
Sheets("Quilicura").Unprotect
Dim bodega, producto, insumo, articulo, equipo As String
Dim cantidad, precio, factura, id As Integer
Dim fecha As Date
bodega = Sheets("FormularioIngreso").Range("G3").Value
producto = Sheets("FormularioIngreso").Range("G5").Value
insumo = Sheets("FormularioIngreso").Range("G7").Value
articulo = Sheets("FormularioIngreso").Range("G9").Value
equipo = Sheets("FormularioIngreso").Range("G11").Value
cantidad = Sheets("FormularioIngreso").Range("G13").Value
'precio = Sheets("formularioIngreso").Range("G15").Value
factura = Sheets("FormularioIngreso").Range("G17").Value
Sheets("DATOS").Range("C1").FormulaR1C1 = "=TODAY()"
fecha = Sheets("DATOS").Range("C1").Value
Select Case insumo
Case "1"
insumo = "Películas"
Case "2"
insumo = "Químicos"
End Select
Select Case articulo
Case "1"
articulo = "Chasis"
Case "2"
articulo = "Negatoscopios"
End Select
Select Case equipo
Case "1"
equipo = "Reveladora"
Case "2"
equipo = "Digitalizador"
Case "3"
equipo = "Impresoras"
End Select

precio = Application.WorksheetFunction.VLookup(articulo, Sheets("DATOS").Range("A10:C20"), 3, 0) * cantidad

id = 0
Select Case bodega
Case "1"
Sheets("Los Leones").Activate
Sheets("Los Leones").Range("A1").Select
'Selection.End(xlDown).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
id = id + 1
Loop
    Select Case producto
    Case "1"
    With ActiveCell
.Value = "Insumo"
.Offset(0, 1).Value = insumo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "2"
With ActiveCell
.Value = "Artículo"
.Offset(0, 1).Value = articulo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha

.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "3"
With ActiveCell
.Value = "Equipo"
.Offset(0, 1).Value = equipo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha

.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
End Select

Case "2"
Sheets("Irarrazaval").Activate
Sheets("Irarrazaval").Range("A1").Select
'Selection.End(xlDown).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
id = id + 1
Loop
    Select Case producto
    Case "1"
    With ActiveCell
.Value = "Insumo"
.Offset(0, 1).Value = insumo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "2"
With ActiveCell
.Value = "Artículo"
.Offset(0, 1).Value = articulo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "3"
With ActiveCell
.Value = "Equipo"
.Offset(0, 1).Value = equipo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
End Select

Case "3"
Sheets("Quilicura").Activate
Sheets("Quilicura").Range("A1").Select
'Selection.End(xlDown).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
id = id + 1
Loop
    Select Case producto
    Case "1"
    With ActiveCell
.Value = "Insumo"
.Offset(0, 1).Value = insumo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "2"
With ActiveCell
.Value = "Artículo"
.Offset(0, 1).Value = articulo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
Case "3"
With ActiveCell
.Value = "Equipo"
.Offset(0, 1).Value = equipo
.Offset(0, 2).Value = cantidad
.Offset(0, 3).Value = precio
.Offset(0, 4).Value = fecha
.Offset(0, 5).Value = factura
.Offset(0, 6).Value = id
End With
End Select

End Select
Sheets("FormularioIngreso").Activate
Sheets("Los Leones").Protect
Sheets("Irarrazaval").Protect
Sheets("Quilicura").Protect

Application.ScreenUpdating = True

End Sub
Leer más...

jueves, 23 de enero de 2014

Macro para copiar una tabla de un archivo Excel a otro

En algunas ocasiones se cuenta solamente una parte de los datos (en formato Excel) y es necesario unificar esta información en un solo archivo Excel. Por ejemplo, se puede contar con el archivo “Consumo” que contiene las ventas del mes de enero y se necesita copiar esta información al archivo “Compilado” que contiene todas las ventas del año. Para automatizar este proceso que se realizará todos los meses se recurre a la creación de una macro.


Primero, nos damos como supuesto el hecho de que el archivo “Consumo” se encuentra siempre en la misma carpeta y siempre tiene ese nombre. 

La idea de la macro es rellenar la hoja "Destino" del libro “Compilado” con el simple click de un botón. 


Los datos que se copiarán están en la hoja "consumo de articulos" del libro "Consumo". Estos datos están ubicados en una tabla que tiene las mismas columnas en el mismo orden que la tabla que está en la hoja "Destino".


La macro llamada "AgregarPlanilla" tiene el siguiente código:

Lo primero que se debe hacer es encontrar una celda vacía en la columna "A" del libro "Compilado" (libro activo) donde copiar la tabla. Para esto primero activamos la celda "A1" y por medio de la funcion Do While... Loop le decimos a la macro que baje a la siguiente fila cuando la celda no está vacia. La iteración se detiene cuando encuentra una celda vacia en la columna "A". Esta celda la guardamos en la variable del tipo Range llamada "celdadestino". 



Luego se abre el libro excel "Consumo" y se activa la hoja "consumo de articulos" porque esta es la que contiene la información que se quiere copiar.


Despues con el comando CurrentRegion marcamos el área que comprende la tabla de datos la cual sabemos que incluye la celda "A1". Las celdas que comprenden esta área la llamamos "tabla". 

A continuacion se selecciona la tabla sin el encabezado y se selecciona para copiar.


Ahora nos posicionamos en la "celdadestino" del libro "Compilado" en la hoja "Destino" y pegamos los datos con el comando Selection.PasteSpecial que permite el pegado especial. Con la indicacion xlPasteAll se pega todo el contenido de las celdas, incluyendo las formulas y el formato (se puede reemplazar xlPasteAll  por Paste:=xlPasteValues si se quiere copiar sólo los valores).


Finalmete se finaliza el copiado y pegado, y se cierra el libro "Consumo".



Descargar Archivo
Leer más...

Creando una Macro para Excel que ejecute Solver u OpenSolver



En esta entrada, crearemos una Macro en Microsoft Excel 2013® que nos permita resolver un Problema de Programación Lineal (o PPL), facilitando tanto la definición como el ingreso de los parámetros y variables que utilizaremos para, posteriormente, ejecutar complementos como Solver u OpenSolver para buscar una solución.

 

1.- Pasos Previos:

Comenzaremos por preparar nuestro Excel, corroborando que tengamos todo lo necesario para llevar a cabo nuestra tarea. En particular:

  • Primero, debemos abrir un libro de Excel y habilitar el complemento "Solver" dirigiéndonos a:
    Archivo → Opciones → Complementos → Click en el botón "Ir" → Marcar "Solver" y click en "Aceptar".


  • Segundo, descargamos OpenSolver y descomprimimos los archivos. Posteriormente nos dirigimos a la siguiente ruta:
    Archivo → Opciones → Complementos → Click en el botón "Ir" → Click en "Examinar" → Y arrastramos los archivos comprimidos a esa ventana y, una vez realizado, seleccionamos el archivo "OpenSolver" y ponemos "Aceptar". Luego volvemos a la ventana anterior, activamos OpenSolver y clickeamos en "Aceptar".


     
  • Tercero, mostraremos la pestaña Desarrollador moviéndonos a:
    Archivo → Opciones → Personalizar cinta de opciones → Marcar "Desarrollador" y click en "Aceptar"
  • Cuarto, guardaremos nuestro documento como un "Libro de Excel habilitado para macros" en:
    Archivo → Guardar Como → Escogemos el nombre, directorio y en Tipo seleccionaremos "Libro de Excel habilitado para macros" y damos click en "Aceptar"

2.- Problema de Programación Lineal:

Realizado lo anterior, debemos contar con un PPL. A modo de ejemplo, utilizaremos el problema:

"Usted quiere abastecerse de cervezas para el verano y cuenta con un presupuesto de $75.000. Para lo anterior, ha cotizado en una distribuidora mayorista los siguientes tipos de cervezas por botella: Cerveza Negra $800 c/u, Cerveza Rubia $700 c/u y Cerveza Artesanal $1200 c/u. Cabe recalcar que cada tipo de cerveza se vende por botellas ( o unidades enteras).

Asimismo, el vendedor le informa que, para acceder a los precios anteriores, usted debe comprar al menos 12 unidades de Cerveza Negra, 24 de Cerveza Rubia y 6 de Cerveza Artesanal."
Un ejemplo para el problema planteado puede ser el siguiente:


En donde:
  • Las Celdas C3 a C5 contienen las celdas variables de nuestro problema (destacadas en color azul).
  • La Celda A13 contiene la función objetivo (destacada en amarillo), que contiene la sumatoria de las multiplicaciones de cada precio unitario por las unidades respectivas. 
  • Las Celdas C9 a C11 contienen las restricciones de unidades mínimas a consumir.
  • Las Celdas B15 a B17 nos recuerdan que debemos imponer que las celdas variables sean enteros.

 

3.- Trabajando con Nuestra Macro:

Una vez definido nuestro PPL a resolver, podemos comenzar a programar nuestra Macro. En primera instancia, supondremos que deseamos que el usuario final no tenga la posibilidad de editar los parámetros y variables de nuestro problema, por lo que el usuario utilizará la Macro para obtener solamente el resultado. 

Comenzaremos por crear nuestra Macro clickeando en el botón "Macro" dentro de la pestaña Desarrollador. En la ventana emergente, indicamos que llamaremos a nuestra Macro "ResolverOculto" (sin comillas) y apretamos el botón "Crear" para, posteriormente, clickear en "Modificar". Luego, se nos abrirá la ventana de "Microsoft Visual Basic para Aplicaciones", en donde podremos programar nuestra Macro.

En ésta última ventana, deberemos activar las referencias a Solver y OpenSolver (si es que usaremos los dos) dirigiéndonos hacia:
Herramientas → Referencias → Marcamos "Solver" y "OpenSolver" y damos click en "Aceptar".


 
A continuación, debemos programar la macro con las instrucciones necesarias para que se ejecute el Solver o el OpenSolver correctamente. Se muestra una imagen a continuación que posee comentarios con la explicación de los comandos e instrucciones utilizadas para construir nuestra Macro:




Nota 1: Para correr el OpenSolver se debe quitar el apostrofe ( ' ) que se encuentra antes de la expresión "RunOpenSolver=True".

Nota 2: Cabe mencionar que para controlar Errores se incluyeron la expresiones: "On Error GoTo Tratar_Errores" (al inicio de la Macro), "Exit Sub", "Tratar_Errores:" y un Mensaje que señala que ha ocurrido un error y el programa ha finalizado (al final de la Macro).


Otro situación a la que nos podemos enfrentar consiste en que queramos que el usuario ingrese los parámetros y restricciones para nuestro modelo. Para lograr lo anterior, creamos una nueva Macro llamada ResolverInteractivo (siguiendo el mismo procedimiento empleado para crear ResolverOculto). A continuación, explicaremos por partes el código programado:

En la imagen anterior se aprecia lo siguiente:
  1. Primero, se genera la expresión para el control de errores. 
  2. Segundo, se definen las variables "temp" que utilizaremos. 
  3. Tercero, se restablecen los parámetros del Solver mediante el comando SolverReset. 
  4. Cuarto, se solicita que el individuo indique si quiere Maximizar (1), Minimizar (2) o Alcanzar un Valor Objetivo (3) y se controlan errores de ingreso mediante un comando "Do While". 
  5. Quinto, se solicita que el usuario seleccione la celda objetivo.
  6. Sexto, se requiere que la persona ingrese las celdas variables.
  7. Séptimo, se generan distintos escenarios según el problema que va a resolver el individuo. Lo anterior se hace con el fin de definir el modelo de manera correcta. Cabe señalar que se utiliza la función SolverAceptar señalando la Función Objetivo (definirCelda), el tipo de problema a resolver (valorMáxMín), el valor deseado (valorDe, que es "0" para los problemas 1 y 2) y las celdas variables (celdasCambiantes).  



En la segunda imagen, notamos que:
  1. Primero, se pregunta el número de restricciones a ingresar. 
  2. Segundo, se definen las variables "aux" que utilizaremos. 
  3. Tercero, se crea un ciclo para ingresar el número de restricciones, pidiendo que ingrese el lado izquierdo restricción. Luego, se solicita que señale la relación ingresando un 1 para menor o igual, 2 para igual, 3 para mayor o igual, 4 para enteros y 5 para binarios. 
  4. Cuarto, se generan distintos escenarios según el tipo de relación, separando los casos 4 y 5 del resto. La idea es utilizar la función SolverAgregar que requiere el lado izquierdo de la restricción (referenciaCelda), la relación (relación) y el lado derecho de la restricción (Formula, que no corre para los casos 4 y 5).
  5. Quinto, se restablecen las variables "aux" y se va a la siguiente iteración.




En la tercera imagen, se aprecia que:
  1. Primero, se vuelven a ingresar los parámetros con el SolverAceptar. Lo anterior es requerido por el Solver para poder operar.
  2. Segundo, se definen las opciones adicionales del Solver (las dejamos fijas para el caso analizado).
  3. Tercero, se ejecuta el Solver sin mostrar el cuadro de diálogo al finalizar. Además, se señala que mantendremos el resultado final encontrado por la aplicación. 
  4. Finalmente, aparecen las líneas relacionadas con el tratamiento de errores.
Con todo lo anterior, cualquiera de las dos macros mostradas en la presente entrada debiese arrojar un resultado como el siguiente:
Finalmente, es importante volver a recalcar que debemos tener habilitados los complementos (Solver y OpenSolver). Además, dichos complementos deben ser referenciados en nuestra macro tal y como se mencionó anteriormente.
En el siguiente Link, podrán descargar el Excel utilizado en la siguiente entrada (con sus respectivas Macros incorporadas). Adicionalmente, se entregan los archivos de texto de las Macros programadas:
ResuelveOculto (Texto)
ResuelveInteractivo (Texto)


Referencias:
  • Microsoft (Solver en Macros): http://support.microsoft.com/kb/843304/es
  • Microsoft (Funciones VBA de Solver): http://msdn.microsoft.com/en-us/library/office/ff196600.aspx
  • Microsoft: (Función SolverReset): http://msdn.microsoft.com/en-us/library/office/ff821349.aspx
  • Excel-Easy: http://www.excel-easy.com/vba/range-object.html
  • Microsoft (Inputbox): http://msdn.microsoft.com/en-us/library/office/ff839468.aspx
  • ExcelTip (Referenciar): http://www.exceltip.com/custom-functions/how-to-use-your-excel-add-in-functions-in-vba.html
  • OpenSolver: http://opensolver.org/installing-opensolver/

Entrada publicada el 22 de enero de 2013 por Pierre Mariani R.
Leer más...

miércoles, 22 de enero de 2014

Macro para compartir eventos/tareas/deadlines entre distintos usuarios en un archivo Excel

La siguiente macro está diseñada en conjunto al archivo Excel con el objetivo de servir de nexo para el trabajo colaborativo en equipos de trabajo, especialmente aquellos que se encuentran en oficinas y/o comparten una red local que les permite trabajar conectados.

Usos posibles de la macro

1. Cuadro de control y monitoreo para delegación de tareas: Se pueden ingresar tareas y Deadlines de forma unificada que aparecen en monitores individuales para los distintos usuarios con acceso a la planilla. Estos pueden actualizar el progreso de las tareas delegadas y el administrador puede hacer seguimiento de estas.
2. GANTT Colaborativo: Se puede realizar una planificación centralizada, la cual puede ser compartida y delegada inmediatamente, así como también es posible su posterior seguimiento.
3. Planificador de actividades: Se pueden compartir eventos con otros usuarios, con distintos niveles de acceso.

Potencial de la macro

El código de la macro lo programé para que fuese ampliable a múltiples usuarios, pudiendo incluso tener una base independiente de procesos y usuarios posibles para una mayor capacidad.
Al estar programada en Vba de Excel, su uso puede ser asimilado fácilmente por usuarios nuevos, dado que es una herramienta de uso común.

Requerimientos de la macro y supuestos

La macro requiere de una planilla en la que existan un mínimo de 3 hojas, un Planificador, un Usuario y una base de actualizaciones. Los supuestos son:

1. La macro programada contiene a 2 usuarios, los cuales son autentificados con los RUT 17467733 y 10000000, de los cuales el primero corresponde a un usuario planificador (Administrador) y el segundo a un usuario normal, que en este caso será un simil del usuario invitado para efectos de revisión. Además, la macro se diseño con los siguientes supuestos:
2. Contiene un máximo de 5 tareas/eventos delegables, esto dado que el código se encuentra comprimido en una sola macro en su mayoría, sin embargo, es fácilmente extendible armando una base de procesos (una hoja que aloje todos los procesos, los usuarios y sus deadlines.
3. Contiene 2 usuarios, también se comprimió el numero de usuarios para efectos de almacenarlos en una sola macro, aunque al igual que el punto anterior, es fácilmente extendible armando un listado de usuarios en una hoja independiente que alimente el código.
4. Para actualizar los estados posibles así como las observaciones de las tareas/eventos delegados, se implementa un formulario básico cuyo código VBA se encuentra en el apartado 2.
5. Con objeto de mantener la privacidad de los monitores individuales y como precaución ante borrado de datos o mal uso, es que las planillas quedan ocultas con el codigo "= xlVeryHidden". Con esto se asegura que los individuos solo accedan a los monitores autorizados.

Descripción de la macro:

La macro se encarga principalmente de mostrar cuales son las tareas o eventos en los que el usuario participa o que se le hayan delegado, permitiendole actualizar el estado de avance, colocar observaciones y verificar el tiempo restante para cumplir los plazos (deadlines) registrados.

Las pantallas del archivo en los que actúa la Macro son las siguientes:



1. Vista HOME, Botón activa la macro.

2. La macro inicia con un cuadro de autentificación de usuario.

3. Monitor de Planificador, el administrador del documento.

En la Hoja "Planificador", el usuario puede editar los campos "Usuario" (a quien delega), "Evento" (Actividad que se delega), "Descripción" (referente al Evento), "Estado" (cual es el estatus del evento, así como una observación del usuario mostrada como comentario de la celda) y los "Días Deadline 1, 2 y 3", los cuales son campos de fecha que indican periodicidad. A continuación vemos un ejemplo:
"El evento viajar "donde sea" se encuentra frustrado por verano y como comentario aparece "eso pasa por tomar cursos de verano". Además, este evento debe realizarse 3 veces al año siendo las fechas limite el 05 de marzo, 05 de agosto y 5 de diciembre."

4. Monitor de Usuario, muestra las tareas/eventos delegados a ese usuario.


5. Formulario de actualización de estados y observaciones de los eventos.
Las observaciones aparecen como comentarios en las celdas de los estados.

El código de la macro es el siguiente:


'Inicio Código VBA - Apartado 1 (Macro Principal)
Sub INGRESO()

Dim Pagina As String
Dim RUT As String
Dim contador As Integer
Dim codigo As String
Dim Comment As String

'Entrar a modulo individual
RUT = InputBox("Introduzca su RUT (sin digito verificador, puntos ni guión): ", "Ingreso a Módulo Individual")
    If RUT = "17467733" Then
    Sheets("Planificador").Visible = True
    Sheets("Planificador").Select
    Range("C2").Select
    
     'Macro Genérica que actualiza los estados de los eventos delegados
    contador = 5
    Sheets("Base_Actualizaciones").Visible = True

    'Cantidad maxima de eventos por persona = 20
    Do While contador < 20
    Range("F" & contador).Select
    Selection.ClearComments

    'la búsqueda se realiza por el código del evento asignado en la hoja "Planificador"
    'se usa "Pagina" para que sea extendible a muchos usuarios
    Pagina = Application.ActiveSheet.Name
    codigo = Sheets(Pagina).Range("C" & contador)
    
        If codigo <> "" Then
        Sheets("Base_Actualizaciones").Select
        ActiveSheet.Range("$C$3:$G$20000").AutoFilter Field:=1, Criteria1:= _
                    codigo
        Range("F3").Select
        Selection.End(xlDown).Select
        Selection.Copy
        Sheets(Pagina).Select
        Range("F" & contador).Select
        ActiveSheet.Paste

        ' almacena observacion y crea el comentario
        Sheets("Base_Actualizaciones").Select
        Range("G3").Select
        Selection.End(xlDown).Select
        Comment = ActiveCell.Value
        Sheets(Pagina).Select
        Range("F" & contador).AddComment
        Range("F" & contador).Comment.Visible = False
        Range("F" & contador).Comment.Text Text:="CompNeg:" & Chr(10) & Comment
        Sheets("Base_Actualizaciones").Range("$C$3:$G$20000").AutoFilter Field:=1
        contador = contador + 1
        Else
        Exit Do
        End If
    Loop
    Sheets("Base_Actualizaciones").Visible = xlVeryHidden

    Else
    'Demo de la macro solo para 2 usuarios, ambos registrados y no permite invitados
    'Busca RUT dado que al sumar usuarios, los monitores se buscan por este atributo
    Sheets(RUT).Visible = True
    Sheets(RUT).Select
    Range("C2").Select
    'Dado que pueden haber multiples monitores, se aplica a la hoja en uso
    Pagina = Application.ActiveSheet.Name
    'Borra contenido
    Range("D14:F14").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    'Actualiza los eventos asignados
    Sheets("Planificador").Visible = True
    Sheets("Planificador").Select
    Range("C2").Select
    ActiveSheet.Range("$B$4:$M$11").AutoFilter Field:=1, Criteria1:= _
        RUT
    Range("C5:E5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets(RUT).Select
    Range("D6").Select
    ActiveSheet.Paste
    Range("D7").Select
    'Actualiza los días restantes para el siguiente Deadline programado
    Sheets("Planificador").Select
     Range("M5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets(RUT).Select
    Range("H6").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D7").Select
    'Quita filtro y oculta
    Sheets("Planificador").Select
    ActiveSheet.Range("$B$4:$M$11").AutoFilter Field:=1
    Range("B13").Select
    Sheets("Planificador").Visible = xlVeryHidden
    Sheets(Pagina).Select
    'Macro Genérica para la actualización de todos los estados.
    contador = 6
    Sheets("Base_Actualizaciones").Visible = True
    'Cantidad maxima de eventos por persona = 20
    Do While contador < 20
    Range("G" & contador).Select
    Selection.ClearComments
    'la busqueda se realiza por el código del evento asignado en la hoja "Planificador"
    codigo = Sheets(Pagina).Range("D" & contador)
    
        If codigo <> "" Then
        Sheets("Base_Actualizaciones").Select
        ActiveSheet.Range("$C$3:$G$20000").AutoFilter Field:=1, Criteria1:= _
                    codigo
        Range("F3").Select
        Selection.End(xlDown).Select
        Selection.Copy
        Sheets(Pagina).Select
        Range("G" & contador).Select
        ActiveSheet.Paste
        ' almacena observación y crea el comentario
        Sheets("Base_Actualizaciones").Select
        Range("G3").Select
        Selection.End(xlDown).Select
        Comment = ActiveCell.Value
        Sheets(Pagina).Select
        Range("G" & contador).AddComment
        Range("G" & contador).Comment.Visible = False
        Range("G" & contador).Comment.Text Text:="CompNeg:" & Chr(10) & Comment
        Sheets("Base_Actualizaciones").Range("$C$3:$G$20000").AutoFilter Field:=1
        contador = contador + 1
        Else
        Exit Do
        End If
    Loop
    Sheets("Base_Actualizaciones").Visible = xlVeryHidden
    End If

End Sub
'Término de Código VBA

'Inicio Código VBA - Apartado 2 (Formulario)
Private Sub ComboBox1_Change()
ComboBox1.AddItem ("FRUSTRADO POR VERANO")
ComboBox1.AddItem ("DELEGADO")
ComboBox1.AddItem ("FRUSTRADO POR ESTUDIO")
End Sub
Private Sub ComboBox3_Change()
Dim evento As String
Dim contador As Integer
evento = ComboBox3.Value
contador = 5
      
Do While True
If Range("Planificador!C" & (contador)) = evento Then
Exit Do
Else
contador = contador + 1
End If
Loop
Label8.Caption = Range("Planificador!D" & Trim(Str(contador)))
Label9.Caption = Range("Planificador!E" & Trim(Str(contador)))
End Sub
Private Sub UserForm_Initialize()
ComboBox2.AddItem ("17467733")
ComboBox2.AddItem ("10000000")

Label8.Caption = "Esperando código"
Label9.Caption = "Esperando código"

Dim Counter As Integer
Counter = 1
While Counter < 6
ComboBox3.AddItem (Counter)
Counter = Counter + 1
Wend
End Sub
Private Sub CommandButton1_Click()
Dim User As String
Dim codigo As Integer
Dim Estado As String
Dim OBS As String
Dim ultimafila As Double

 codigo = ComboBox3.Value
 Estado = ComboBox1.Value
 OBS = txtObservacion.Value
 Usuario = ComboBox2.Value

    Sheets("Base_Actualizaciones").Visible = True
    Sheets("Base_Actualizaciones").Select
    ultimafila = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    
    Cells(ultimafila + 1, 2) = Usuario
    Cells(ultimafila + 1, 3) = codigo
    Cells(ultimafila + 1, 6) = Estado
    Cells(ultimafila + 1, 7) = OBS

txtObservacion = ""
ComboBox1 = ""
ComboBox3 = ""
ComboBox2 = ""
Label8.Caption = "Ingrese un código válido."
Sheets("Base_Actualizaciones").Visible = False
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub
'Término de Código VBA

ENLACES

A Continuación se presenta el archivo utilizado. La planilla contiene el código y el Formulario.
Descargar Fichero EXCEL


Leer más...