【问题标题】:How do I track who uses my Excel spreadsheet?如何跟踪谁使用我的 Excel 电子表格?
【发布时间】:2013-08-19 16:59:34
【问题描述】:

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

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

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

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

这种安排在 Excel 2010 Professional Plus 中是否可行?

【问题讨论】:

  • 真的需要密码保护吗?还是您最终只需要弄清楚谁在使用它?
  • 如果用户共享密码,那么他/她不妨共享解锁的工作表。运气不好!
  • @Zemens 我最终需要弄清楚谁在使用它。
  • 还有一项名为 HiveLink (hivelink.io) 的新服务,您可以在其中创建电子表格的“轻量级”克隆并与用户共享。轻量版没有任何IP和计算,它只是作为一个输入接口和一个输出接口。 HiveLink 将轻量级电子表格与计算机上的原始电子表格安全连接。您还可以控制谁有权访问,人们必须登录才能使用输入/输出。它现在处于公开测试阶段,因此您可以免费使用。

标签: excel excel-formula excel-2010 vba


【解决方案1】:

我认为你所描述的方法中的密码保护即使是可行的也是不必要的麻烦。

他要求我用密码保护 Excel 电子表格,这样一个密码就不会解锁人们可以从网站下载的所有副本。

我无法想象仅使用 Excel 怎么可能做到这一点。也许外接程序可以做到这一点,但在文件级别,我不认为可以做到,至少不容易。

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

听起来这是非常重要的一点。您没有将密码用作安全措施,而只是作为确定在使用该文件的一种把关方法。这可以通过其他方式实现自动化,其中最简单的方式是使用某些 Environment 变量,例如:

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

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

或者,您可以将日志/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

【讨论】:

  • 我无法写入网络。这个环境听起来很有趣。让 Outlook 向我发送一封电子邮件会很有效,但用户不能只是打断它,并安排一些事情,以便电子邮件在撰写时永远不会发送吗?
  • 不,您可以轻松地静默发送电子邮件。用户甚至不会知道它正在发生。我现在在我创建的 PowerPoint 应用程序/加载项上执行此操作,只要有未处理的错误,就会向我发送电子邮件,以便我进行故障排除。
  • 我将提供一些示例代码,可能会帮助您获得关注。
  • 只有在启用宏时才会“静默”发送。对于具有简单 xlsx 文件的默认环境,它是否可以静默工作?无论如何,谢谢你的代码。:)
  • 即使启用了宏,用户也可以根据需要阻止宏运行。打开一个空白工作簿很容易,将 Application.EnableEvents = false,然后打开上述工作簿,Workbook_Open 事件将永远不会被触发。然后用户可以删除 VBA,即使它受密码保护,因为 Excel 中的密码保护是个笑话。
【解决方案2】:

扩展大卫的答案,您还可以使用在打开工作表时自动运行的宏,它可以将 Environ("username") 写入隐藏工作表中的下一个可用行。我以前用过 Environ("username"),它非常有用、快速、简单。

任何工作表上的这个子程序都会自动运行 (IIRC):

Private Sub Auto_Open()

End Sub

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

【讨论】:

  • Auto_Open 需要在标准模块中。
  • 实际上这比使用 Workbook_open 安全得多,因为即使您禁用 Application.EnableEvents,Auto_Open 也会运行,这会阻止 Workbook_Open 运行。很好,我不知道这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2020-08-19
  • 2017-08-11
  • 2011-06-02
  • 2018-07-27
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多