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.