6

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

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

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

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

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

4

2 に答える 2

7

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

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

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

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

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

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

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

または、電子メールを送信する代わりに、ログ/txt ファイルを共有ネットワークの場所に書き込むことができる場合があります (もちろん、ユーザーがネットワークに接続していると仮定します)。

アップデート

これは、Web 上の場所から取ったコードの例です。ユーザーから電子メールを送信します。sendToメールアドレスを受信者として使用するには、行を変更する必要があります。

これを Workbook のコード モジュールに入れると、このファイルを開くたびに電子メールが送信されます。

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
于 2013-08-19T17:13:57.033 に答える
1

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

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

Private Sub Auto_Open()

End Sub

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

于 2013-08-19T18:05:51.227 に答える