web-dev-qa-db-ja.com

Excelスプレッドシートを使用しているユーザーを追跡するにはどうすればよいですか?

上司が会社の内部Webサイトに配置したいExcelスプレッドシートを作成しました。スプレッドシートには、めったに使用されない、難解ですが、社内の特定の従業員だけが本当に役立つと思う便利な機能がいくつか含まれています。

問題は、将来のユーザーが誰であるかわからないことです。上司は、スプレッドシートを使用しているユーザーを特定するように求めています。

彼は、1つのパスワードでサイトからダウンロードできるすべてのコピーのロックが解除されないようにExcelスプレッドシートをパスワードで保護するように依頼しました。たとえば、ユーザーが合法的にパスワードを取得して他の人と共有すると、パスワードを「stackoverflow」にすることはできません。これは、社内の誰でも使用して、その後ダウンロードするすべてのスプレッドシートのロックを解除できます。誰がスプレッドシートを使用しているかを確認することはできません。また、ウェブサイトを変更することはできませんので、Excelやメールでこのようなユーザーの追跡を実現したいと思っています。

Excelで文字列をランダムに生成し、ユーザーからメールで送信してから、(生成された文字列に基づいて)ファイルのロックを解除する適切なパスワードで応答する方法はありますか?これには、ユーザーがスプレッドシートを使用する前に私と一緒にチェックインする必要があります(理想的な状況)。

そのような配置はExcel2010 Professional Plusで可能ですか?

5
phan

あなたが説明する方法でのパスワード保護は、それがまったく実行可能であるとしても、不必要に面倒だと思います。

彼は、1つのパスワードでサイトからダウンロードできるすべてのコピーのロックが解除されないようにExcelスプレッドシートをパスワードで保護するように依頼しました。

これがExcelだけを使ってどのように可能になるか想像できません。アドインでこれを実行できるかもしれませんが、ファイルレベルでは、少なくとも簡単には実行できないと思います。

誰がスプレッドシートを使用しているかを確認することはできません。

これは本当に重要なビットのようです。パスワードをセキュリティ対策として使用しているのではなく、whoがファイルを使用していることを確認するためのゲートキーピング方法としてのみ使用しています。これは他の方法で自動化できますが、最も簡単な方法は、特定のEnvironment変数を使用することです。例:

MsgBox Environ("username")は、現在のユーザー名を含むメッセージボックスを表示します。

Environ("username")を文字列変数に割り当てると、たとえばOutlookを自動化して、「JohnDoeがファイルを開いた」などのメールを送信できます。毎回メールが届かないようにしたい場合は、ExcelファイルのNamed Range変数を微調整して、マクロがメールを1回だけ送信するようにすることができます。

または、電子メールを送信する代わりに、ログ/ 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("[email protected]")
        sendTo.Type = 1 'To olTo
    '# assign another recipient
    Set sendTo = mItem.Recipients.Add("[email protected]")
            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
7
David Zemens

Davidの回答を拡張すると、シートを開いたときに自動実行されるマクロを使用して、非表示のワークシートで次に使用可能な行にEnviron( "username")を書き込むこともできます。私は以前にEnviron( "username")を使用しましたが、これは非常に便利で、すばやく、簡単です。

ワークシートのこのサブは自動的に実行されます(IIRC):

Private Sub Auto_Open()

End Sub

次の列にタイムスタンプを付けて、スプレッドシートがいつ使用されたかを示すこともできます...

1
jerussell