Si manejas un archivo compartido en tu red, es probable que desees tener un registro de cada acceso a dicho archivo, por ejemplo, en un formato de registros contables, se puede registrar automáticamente el nombre de usuario, fecha y hora de acceso, incluso la fecha y hora en la que cierra el archivo.
Registrar la apertura del archivo
La idea es que al abrir el archivo, en una hoja que puede estar oculta, se ponga el nombre del usuario, fecha y hora.
Lo primero es definir una hoja que contendrá los datos de los accesos al libro.
En esa imagen vemos la estructura definida para el registro, esa hoja puede estar oculta, incluso se puede ocultar desde el código vba como vemos a continuación.
Private Sub Workbook_Open()
Dim uFila As Long
Dim ws As Worksheet
Set ws = Worksheets("data")
uFila = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ws.Cells(uFila, 1) = "Entrada"
ws.Cells(uFila, 2) = Application.UserName
ws.Cells(uFila, 3) = Date & " " & Time
Worksheets("data").Visible = xlVeryHidden
ActiveWorkbook.Save
End Sub
Ese código se debe guardar en el ThisWorkbook, para abrir el editor de visual basic solo hay que presionar ALT+F11, a la izquierda esta la estructura del proyecto, solo debes ubicar el ThisWorkbook del libro actual y dar doble click para abrirlo.
Registrar la salida del archivo
En el caso de la salida de dicho archivo, el código es casi el mismo, solo se cambia el evento en el que se debe registrar, en este caso es justo antes de cerrar el libro, es decir, cuando se da click en cerrar.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim uFila As Long
Dim ws As Worksheet
Set ws = Worksheets("data")
uFila = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ws.Cells(uFila, 1) = "Salida"
ws.Cells(uFila, 2) = Application.UserName
ws.Cells(uFila, 3) = Date & " " & Time
Worksheets("data").Visible = xlVeryHidden
ActiveWorkbook.Save
End Sub
Las ultimas dos lineas del código sirven para ocultar la hoja donde están los registros y para guardar los cambios, esto ultimo es importante ya que de lo contrario el usuario puede dar clic en cancelar en el mensaje de guardar cambios y aun así se hace el registro de salida, luego cuando realmente cierre se realizara otro registro, así que tu decides si dejas esa linea ActiveWorkbook.Save
Como ver los registros de accesos al libro
Finalmente, para ver los registros, tendrás que entrar Visual Basic presionando ALT+F11, después dar click en el signo mas del proyecto de tu libro y click en el signo mas de Microsoft Excel Objetos, de esa manera podrás ver las hojas que contiene el libro, seleccionas la hoja que tiene los registros y en las propiedades seleccionar la opción xlSheetVisible.
Forzar la activación de macros
Cabe mencionar que esta macro no funcionara si las macros no son activadas, si tu libro forzosamente necesita de macros para poder trabajar con el, entonces no debes tener problema alguno, pero si es un libro que no usa macros para su funcionamiento regular, puedes agregar las siguientes lineas de código tanto para la apertura como en el cierre, justo antes de ActiveWorkbook.Save
Este código va en Workbook_BeforeClose(Cancel As Boolean)
Worksheets("data").Visible = xlVeryHidden
Solo debes cambiar data por el nombre de la hoja que desees ocultar justo al cerrar el libro, de este modo, forzaras al usuario a activar las macros para poder trabajar con el libro.
Entonces si activa las macros, entonces esa hoja deberá ser visible, así que debes poner lo siguiente en Workbook_Open
Worksheets("data").Visible = xlVisible
Puedes agregar mas lineas de esas, en cada linea debes poner el nombre de la hoja que debe ocultarse y abrirse, me refiero a que puedes hacer esto para mas de una hoja, aunque regularmente basta con ocultar la hoja mas importante del libro.
Aun así, esto no funcionara al inicio si las macros no se habilitan, así que tienes que ocultar manualmente esa hoja antes de ponerla a disposición de los usuarios, esto se hace igual desde visual basic seleccionando la opción xlSheetVeryHidden para la hoja que deseas ocultar.
Con ese pequeño truco obligaras al usuario a activar las macros desde la primera vez para que pueda ver esa hoja oculta ya que solo desde el código de la macro se hará visible, después al cerrar el libro, esa hoja se ocultara automáticamente puesto que las macros están activadas.
Esto da para mucho mas, es posible llevar un registro de cada modificación que hace cada usuario, por ejemplo, se puede indicar en una columna lo que había antes y en otra el dato que lo sustituyo, claro que esto provocaría que con el tiempo la cantidad de registros de esa hoja sea enorme, pero esto lo veremos en otro post.
Espero les sea de mucha ayuda este ejemplo.
Marco dice
Hola, buenos días!
Habrá algún método para darnos cuenta si un tercero se mete a nuestro proyecto?
Es decir, que quieran violentar a un libro nuestro por medio del editor de Visual Basic.
Sería como que cuando entren al VBA de nuestro libro, nos envíe un correo automatico con información de quien lo está abriendo.
Gracias,
Giovanny dice
Hola Nolberto; muchas gracias por la información, fue de gran utilidad. Solo tengo una pregunta. Tengo una hoja de datos a la que pueden ingresar dos usuarios mediante una UserForm que desarrolle. Me gustaría saber si es posible que me quede registrado el usuario que ingrese, pues como esta el código que usted amablemente compartió aparece es el usuario del sistema, por lo tanto, no podría rastrear cual fue el usuario que ingresó.
Muchas gracias y quedo muy atento
Cordial saludo
Gabriel Gonzalez dice
Buenos días, Nolberto y gracias por compartir tus conocimientos.
En el ejercicio “Como ver los registros de accesos al libro”, como podría adaptarlo a:
1. El libro lo utilizan varias personas, entonces como poner un usuario y login, para que puedan ingresar a este.
2. Que el usuario y login sean lo que aparecen en la hoja “data”, para saber realmente quienes han ingresado.
arly dice
hola, estoy ocupando las lineas para forzar la apertura del macros, pero me detecta error para mostrar la hoja y el codigo es el mismo ayuda 🙁
Nolberto Lopez dice
Y cual es el error…?
danilo efren dice
Excelente ejercicio.
Gracias por compartirlo.
Saludos
Danilo
Mario Ibarra dice
Buenos días:
Necesito con urgencia:
Actualmente estoy utilizando la siguiente fórmula (Excel) =CONTAR.SI(DESDE:HASTA;”L/M”),donde L/M representa Licencias médicas o reposos médicos.EL punto es que no puedo descontar las licencias médicas que implican días Sábados,Domingos o festivos.¿Cómo puedo lograrlo?
Saludos cordiales,
Mario Ibarra
Nolberto Lopez dice
Puedes usar la función DIAS.LAB