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.

image

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.

[embedyt]https://youtu.be/ghNKJb0fov4[/embedyt]

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

Descargar el ejemplo Crear un histórico y saber cuántas veces se abre un archivo de Excel – EXCELeINFO.rar

17 thoughts on “Macro para crear un log y saber cuántas veces se abre un archivo de Excel”

  1. 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

    1. 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.

  2. Pingback: Macro para crear un log y saber cuántas veces se abre un archivo de Excel « MVPs de LATAM

  3. 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.

  4. Pingback: Pendiente Error 424 en tiempo de ejecucion

  5. 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???

    1. sergioacamposh

      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.

      1. Hola Sergio. Los dos archivos estan en la misma carpeta y el módulo de clase se llama clsApp.
        Adjunto imágenes…

          1. sergioacamposh

            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”

          2. 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.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top