¿Quién ha abierto mi libro de Excel?
Basado en la opción de confirmación de lectura que tiene Microsoft Outlook, te presento una pequeña herramienta que te permitirá averiguar tanto el usuario como el momento exacto en que se ha abierto un libro de Excel.
Atención: Antes de implementar este ejemplo debes saber que cada vez que un usuario abra el archivo, recibirás un correo electrónico de confirmación. Esto puede parecer algo inofensivo, pero si se hace una gran distribución y el archivo es abierto por cientos o miles de usuarios, recibirás otros tantos correos electrónicos, lo que puede ser agobiante.
La mayor parte del código que contiene el archivo que adjunto al pie del artículo se encuentra dentro del evento Open del libro. Además, he creado un módulo que contiene una pequeña función que extrae el nombre de usuario de Windows en caso de no tener configurado el remitente en Outlook.
Inserta el siguiente código en el módulo de libro:
Option Explicit Private Sub Workbook_Open() Dim objOutlook As Outlook.Application Dim objOutlookMsg As Outlook.MailItem Dim objOutlookRecip As Outlook.Recipient Dim strUser As String Set objOutlook = CreateObject("Outlook.Application") Set objOutlookMsg = objOutlook.CreateItem(olMailItem) strUser = cptName If cptName = "" Then strUser = Application.UserName On Error Resume Next With objOutlookMsg ' La siguiente línea es la que contiene el correo del destinatario Set objOutlookRecip = .Recipients.Add("micorreo@correo.com") objOutlookRecip.Type = olTo .Subject = "Atención: Se ha abierto el archivo " & ThisWorkbook.Name .Body = "El archivo " & ThisWorkbook.Name & _ " fue abierto por " & strUser & " el " & Date & " a las " & Time & _ " h." & vbLf & vbLf objOutlookRecip.Resolve .Send End With Set objOutlook = Nothing End Sub
Y este otro en un módulo estándar:
Option Explicit Declare Function GetUserName Lib "advapi32.dll" _ Alias "GetUserNameA" (ByVal lpBuffer As String, _ nSize As Long) As Long Function cptName() Dim Buffer As String * 100 Dim BuffLen As Long BuffLen = 100 GetUserName Buffer, BuffLen End Function
- Para que el código funcione correctamente, el usuario debe tener Microsoft Outlook abierto. En caso contrario, se produce un error que es gestionado por la instrucción On Error Resume Next, por lo que no se muestra de ninguna forma.
- Si deseas implementar este código en otro archivo, tienes que habilitar la referencia a Microsoft Outllook 14 Object Library.
Si tienes cualquier duda puedes plantearla en el foro de Ayuda Excel.
Muy buena: Supongo que te estarás hinchando a recibir correos… como acaba de ser el mÃo.
El inconveniente que tiene es que no pasa desapercibido ¿podrÃa hacerse?.
Excelente,
¿A qué te refieres con que no pasa desapercibido?
Resumiendo, para cada cliente de correo (cuyo modelo de objetos fuese accesible) habrÃa que desarrollar una macro diferente.
Me parece interesante, con esta macro, a parte de saber quién abre, consigues también su dirección de correo electrónico (al menos la de su perfil en outlook), de modo que puede ser un poco “ilÃcito”.
PodrÃa hacerse también, haciendo que el excel lo envÃe desde un servidor de correo externo (evitando asà el que el usuario tenga abierto el outlook), claro que el ordenador debe tener activada la conexión a internet, pero puedes enviarte un correo desde tu propio correo con la información necesaria (solo obtendrÃas la información de la apertura del libro, no tendrÃas el mail, claro)
Un saludo
Andrés
SERGIO.
BUENOS DIAS, ENCONTRE TU PAGINA Y PEDIRTE COLABORACION Y ACONSEJARME LA MEJOR MANERA DE MANEJAR BASE DE DATOS CON ALIMENTACION AUTOMATICA DE DATOS, YA QUE EN ESTA INCURSION QUE REALICE EN MI TRABAJO CON EL OBJETIVO DE AUTOMATIZAR LA GRANINFORMACION QUE TENEMOS CREE BASE DE DATOS CON FORMULAS Y QUE AL FINAL RESULTARON CARGOSAS YA QUE NO ABRIAN Y EN ALGUNOS MOMENTOS SE COLGABAN. Y BUENO DESPUES DE PASAR POR ESOS PROBLEMAS AHORA ESTOY CREANDO BASE DE DATOS CON VBA PARA LA ALIMENTACION DE DATOS Y ESPERO NO PASAR POR LO MISMO.
ESPERO TUS COMENTARIOS.
HECTOR.
Hola,
Al abrir el archivo que mandas, me da el siguiente error:
Error de compilación.
No se ha definido el tipo definido por el usuario
Qué es lo que sucede?
Habilita la librería de la que hablo al final del artículo. Con eso funcionará correctamente.
Buenos días. Me parece muy interesante este artículo.
¿Se podría hacer una macro que cada vez que un usuario abre el archivo se copie su nombre de usuario y la fecha en una hoja del Excel? De esta manera tendríamos la misma información, evitaríamos tener tantos correos electrónicos y no dejaría el rastro de un correo electrónico en la bandeja de salida del usuario.
Hola, Fernando! Claro que es posible, pero perderías el control hasta que el archivo no llegue a ti de nuevo. Si alguien decide hacer una copia del archivo, ya no sabrás los usuarios por los que ha pasado esa copia…
Cierto que perdería el control. Mi caso es diferente. Trabajo con archivos colgados en un portal y con permisos de solo lectura. A mí me gustaría saber cuanta gente ha abierto el fichero para saber si ese fichero es útil y mis compañeros lo utilizan. En el caso que no lo utilicen dejaría de realizar ese fichero que tanto tiempo me lleva hacerlo. A ver si alguien se anima y escribe la macro.
Ahora lo entiendo, Fernando…
Recuerda que si el archivo es de solo lectura, debes tenerlo en cuenta a la hora de crear la macro. Desde el código, cambia los permisos para que se pueda escribir, a continuación ejecutar la macro, y vuelves a establecer los permisos de solo lectura…
Me autorrespondo:
Private Sub Workbook_Open()
Dim i As Integer
i = Worksheets(“Hoja2”).Cells(Rows.Count, 1).End(xlUp).Row + 1
Worksheets(“Hoja2”).Cells(i, 1) = Environ(“Username”)
Worksheets(“Hoja2”).Cells(i, 2) = Date
Worksheets(“Hoja2”).Cells(i, 3) = Time
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
End Sub