I think that password protection in the method you describe is unnecessarily cumbersome, even if it is possible at all.
He asked me to protect the password of the Excel spreadsheet so that one password does NOT unlock all copies that people can download from the site.
I can not imagine how this is possible using only Excel. Perhaps the add-in can do this, but at the file level I don’t think it can be done, at least not so easily.
I can never figure out who uses the spreadsheet.
This seems like a really important bit. You do not use a password as a security measure, only as a data verification method to determine who is using the file. This can be automated in other ways, the easiest of which is to use certain Environment variables, for example:
MsgBox Environ("username") displays a message box with the current username.
You can assign Environ("username") string variable, and then you can, for example, automate Outlook to send you an email that "John Doe opened the file", or something like that. If you want to avoid receiving emails every time, you can make some adjustments using the Named Range variable in the Excel file, so that the macro will send messages only once, etc.
Alternatively, you can write the / txt log file to a shared network folder (of course, provided that the user is connected to the network) instead of sending emails.
Update
Here is an example of the code that I took from places on the Internet, it will send an email from the user. You will need to change the sendTo lines to use your email address as a recipient, etc.
Put this in the workbook code module, it should send you an email every time you open this file:
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 '