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


No hay comentarios:

Publicar un comentario