Hi Barry,
I know what you're saying with the opening 2 instances of XL, but I wouldn't make the add-in read only. You'll find that you get the same error with the personal.xls file if you open a second instance of XL as well. IMHO, the problem there lies with the fact that XL is started more than once, not the the workbook is protected or not. The second XL instance would then consume more resources and memory on you system, and should be avoided anyway. Personally, I just opt to shut down the second instance, and train my users to do so as well.
FYI, an addin is a hidden workbook in XL, so a user cannot save it (or anything to it) unless you specifically code a routine to do so.
With regards to other points for an add-in, it depends on how far you want to distribute it, and how "sexy" you want to make it. To make it look professional, you can modify the description that shows up when you select the Addin in the Addin's installation menu (choose File|Properties|Summary, and enter something in the comments field.)
For the code, definately follow Zack's advice. Use Option Explicit, (to force the variable declaration,) and make sure that you thouroughly test the add-in with multiple workbooks open... preferably without your intended add-in as the workbook in focus. (Make something else the activeworkbook, then run you code and see what happens.) Finally, when you've got it all working the way you want, compile your code before you save it as an addin. (FYI, if you save it as an addin, and realize you made a mistake, find the "thisworkbook" object in the VBE and set the "IsAddin" property to false to get it back.)
With regards to the worksheet protection, consider using a function like the following:
Function SheetProtected(TargetSheet As Worksheet) As Boolean
If TargetSheet.ProtectContents = True Then
SheetProtected = True
Else
SheetProtected = False
End If
End Function
What this does is evaluate if the "TargetSheet" is protected, and returns True if it is. An example of it's use would be something like this:
Sub test()
Dim ws As Worksheet
Set ws = ActiveSheet
If SheetProtected(ws) Then
MsgBox "Sorry, but " & ws.Name & " is protected!", _
vbOKOnly + vbInformation, ws.Name & " is protected!"
Else
MsgBox "Hooray! " & ws.Name & " is not protected!", _
vbOKOnly + vbInformation, ws.Name & " is unprotected!"
End If
End Sub
You would want to update the "set ws"... line to reflect the sheet you wanted though. Keep in mind, though, that when your workbook is converted to an addin, that it will never be the activeworkbook (or activesheet), so this may suit your purposes already...
HTH,