如何跟踪谁使用我的Excel电子表格?

时间:2013-08-19 16:59:35

标签: excel excel-vba excel-formula excel-2010 vba

我创建了一个Excel电子表格,我的老板想把它放在公司的内部网站上。该电子表格包含一些很少使用,深奥,但方便的功能,只有公司内的某些员工才会发现真正有用。

问题在于我不知道未来的用户是谁,我的老板希望我确定谁使用我的电子表格。

他要求我对Excel电子表格进行密码保护,使得一个密码不能解锁人们可以从网站下载的所有副本。例如,我不能只设置密码“stackoverflow”,因为一旦用户合法地从我那里获取密码并与其他人共享,公司内的任何人都可以使用它来解锁所有随后下载的电子表格。我永远无法确定谁在使用电子表格。另外,我无法修改网站,所以我希望通过Excel和电子邮件实现对用户的跟踪。

有没有办法让Excel随机生成一个字符串,用户通过电子邮件发送给我,然后我使用相应的密码来解锁文件(基于生成的字符串)?这要求用户在使用电子表格之前与我联系(理想情况)。

Excel 2010 Professional Plus中是否可以进行此类安排?

2 个答案:

答案 0 :(得分:7)

我认为你描述的方法中的密码保护是不必要的麻烦,如果它甚至可以实现的话。

  

他要求我对Excel电子表格进行密码保护,使得一个密码不能解锁人们可以从网站下载的所有副本。

我无法想象如何仅使用Excel来实现这一点。也许加载项可以做到这一点,但在文件级别,我不认为它可以完成,至少不容易。

  

我永远无法确定谁在使用电子表格。

听起来这是非常重要的一点。您没有使用密码作为安全措施,仅作为确定正在使用该文件的守门方法。这可以通过其他方式自动完成,最简单的方法是使用某些Environment变量,例如:

MsgBox Environ("username")将显示一个包含当前用户名称的消息框。

您可以将Environ("username")分配给字符串变量,然后您可以自动执行Outlook向您发送“John Doe已打开文件”的电子邮件,或者其他类似内容。如果你想避免每次都收到一封电子邮件,你可以在Excel文件中使用命名范围变量进行一些调整,这样宏只会发送一次电子邮件等等。

或者,您可以将log / txt文件写入共享网络位置(当然,假设用户已连接到网络),而不是发送电子邮件。

<强>更新

以下是我从网络上的某些地方获取的一些示例代码,它将发送来自用户的电子邮件。您必须修改sendTo行才能将您的电子邮件地址用作收件人等。

将此信息放入工作簿的代码模块中,它应该在打开此文件时通过电子邮件发送给您:

Option Explicit
Private Sub Workbook_Open()
' This example uses late-binding instead of requiring an add'l reference to the
' MS Outlook 14.0 Object Library.

    Dim oApp As Object 'Outlook.Application 'Object
    Dim ns As Object 'Namespace
    Dim fldr As Object 'MAPIFolder
    Dim mItem As Object 'Outlook.MailItem
    Dim sendTo As Object 'Outlook.Recipient
    Dim bOutlookFound As Boolean

    On Error Resume Next
    Set oApp = GetObject(, "Outlook.Application")
    bOutlookFound = Err.Number = 0
    On Error GoTo 0
    If Not bOutlookFound Then Set oApp = CreateObject("Outlook.Application") 'New Outlook.Application

    '# Set the namespace and folder so you can add recipients
    Set ns = oApp.GetNamespace("MAPI")
    Set fldr = ns.GetDefaultFolder(6) 'olFolderInbox

    '# create an outlook MailItem:
    Set mItem = oApp.CreateItem(0) 'olMailItem

    '# assign a recipient
    Set sendTo = mItem.Recipients.Add("YourName@Company.Com")
        sendTo.Type = 1 'To olTo
    '# assign another recipient
    Set sendTo = mItem.Recipients.Add("YourManager@Company.Com")
            sendTo.Type = 1
    '# Validate the recipients (not necessary if you qualify valid email addresses:
    For Each sendTo In mItem.Recipients
        sendTo.Resolve
    Next

    mItem.Subject = "A user has opened the Excel file"
    mItem.Body = "This is an automated message to inform you that " & _
                 Environ("username") & " has downloaded and is using the file."

    mItem.Save
    mItem.Send

    'If outlook was not already open, then quit
    If Not bOutlookFound Then oApp.Quit

    Set oApp = Nothing


End Sub

答案 1 :(得分:1)

扩展David的答案你还可以使用一个在打开工作表时自动运行的宏,它可以将Environ(“用户名”)写入隐藏工作表中的下一个可用行。我之前使用过Environ(“用户名”),它非常实用,快速,简单。

任何工作表上的此子目录将自动运行(IIRC):

Private Sub Auto_Open()

End Sub

您还可以在下一列中添加时间戳,以显示电子表格何时使用...