Macro para crear un log y saber cuántas veces se abre un archivo de Excel
Por cualquier motivo que tengamos, la siguiente permite guardar un registro o log de las ocasiones en que abrimos o cerramos un archivo de Excel, siempre y cuando el código lo ingresemos dentro del archivo a auditar y las macros estén habilitadas.
Cómo funciona
Al momento de abrir el archivo lanzamos la ejecución de un procedimiento con el evento Open del libro activo, y en un archivo .CSV se añade una línea que especifica la ruta completa del archivo, la fecha y hora, y el nombre de usuario de Excel, además de un indicativo si el archivo fue abierto o cerrado. El archivo que se creará tendrá como nombre logfile.csv y se creará en la misma carpeta del archivo.
Ver video Macro para crear un histórico y saber cuántas veces se abre un archivo de Excel
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Código
Añadimos en el objeto ThisWorkbook
Private Sub Workbook_Open() Call Iniciar End Sub ' Private Sub Workbook_BeforeClose(Cancel As Boolean) Call Iniciar End Sub
En un módulo normal añadimos
Dim AppObject As New clsApp ' Sub Iniciar() Set AppObject.AppEvents = Application End Sub ' Sub ActualizarLog(Wb) Dim txt As String Dim Fname As String On Error Resume Next txt = Wb.FullName txt = txt & "," & Date & "," & Time txt = txt & "," & Application.UserName txt = txt & "," & "Abierto" Fname = Application.ActiveWorkbook.Path & "logfile.csv" Open Fname For Append As #1 Print #1, txt Close #1 'MsgBox txt On Error GoTo 0 End Sub ' Sub ActualizarLogSalida(Wb) Dim txt As String Dim Fname As String On Error Resume Next txt = Wb.FullName txt = txt & "," & Date & "," & Time txt = txt & "," & Application.UserName txt = txt & "," & "Cerrado" Fname = Application.ActiveWorkbook.Path & "logfile.csv" Open Fname For Append As #1 Print #1, txt Close #1 'MsgBox txt On Error GoTo 0 End Sub
Y en un módulo de clase que deberá llamarse clsApp añadimos
Public WithEvents AppEvents As Application ' Private Sub AppEvents_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) Call ActualizarLogSalida(Wb) End Sub ' Private Sub AppEvents_WorkbookOpen(ByVal Wb As Excel.Workbook) Call ActualizarLog(Wb) End Sub
Descargar el archivo de ejemplo
Crear un histórico y saber cuántas veces se abre un archivo de Excel – EXCELeINFO.rar
Ya perdonarás, pero la instrucción “Dim AppObject As New clsApp” me da “Error de Compilación: No se ha definido el tipo definido por el usuario”.
¿Qué puedo estar haciendo mal?.
Gracias, Juan
Valida por favor qu este código que publi esté en un módulo de clase:
Public WithEvents AppEvents As Application
'
Private Sub AppEvents_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
Call ActualizarLogSalida(Wb)
End Sub
'
Private Sub AppEvents_WorkbookOpen(ByVal Wb As Excel.Workbook)
Call ActualizarLog(Wb)
End Sub
Cualquier cosa comentas.
Disculpa; he estado en el fuera y no podía acceder.
Sí, creé un modulo de clase e introduje el código que indicas.
El error “Error de Compilación: No se ha definido el tipo definido por el usuario”, me da en “Dim AppObject As New clsApp”
Gracias, Juan.
Podrías subir una copia de tu archivo para echarle un ojo, por favor.
http://sdrv.ms/Sjazcp
Gracias, Juan.
Súbelo por favor en zip para poderlo descargar.
http://sdrv.ms/UjLD3q
A ver si así vale.
Gracias.
Omisión mía: faltó especificar que el nombre del módulo de clase debe ser clsApp
Saludos !!
Hola Juan.
Estoy interesado en la posibilidad de poder generar un log de operaciones pero la macro no me funciona. Seguí todos los pasos e inclusive los comentarios pero no puedo hacerla fucionar. No me da ningún error, pero no escribe nada en el .csv.
Sugerencias???
El archivo csv está en la misma carpeta que el archivo de Excel ??
Valida por favor que el módulo de clase se llame clsApp.
Hola Sergio. Los dos archivos estan en la misma carpeta y el módulo de clase se llama clsApp.
Adjunto imágenes…
Podrás compartime tus archivos ? Me interesa ver el código.
Te envío…
https://drive.google.com/file/d/0BzfvlP9N4_DrbENGWDRHOTJld28/edit?usp=sharing
Ya vi dónde está el error y ya lo modifiqué en el artículo. Faltaba añadire la diagonal invertida antes del nombre del archivo .csv para que lo tome como ruta completa.
Fname = Application.ActiveWorkbook.Path & “logfile.csv”
Buenos días Sergio.
Ahora funciona perfecto.
En mi caso realicé una pequeña modificación en la línea
txt = txt & “,” & Application.UserName ya que trabajamos con archivos en red.
Para saber que usuario abrió o cerró el archivo utilizo txt = txt & “,” & Environ(“username”).
Gracias nuevamente.
Seguimos en contacto.