The 2nd part of the query can be handled with the sheet ACTIVATE event
If you are on an NT network, you can use
mUser = environ("username"

to get the id of the current user so within the Sheet_Activate event, you could use something like:
Private Sub Worksheet_Activate()
mUser = Environ("username"

Select Case mUser
Case "user1", "user2"
Exit Sub
Case Else
MsgBox "You do not have permission to use this sheet"
Sheets(sht).Select
sheets(sht).Range("a1"

.Select
End Select
End Sub
This would need to be set up with sht declared as a public variable (string) and this code in the sheet_deactivate code of all the other worksheets:
Private Sub Worksheet_Deactivate()
sht = Me.Name
End Sub
Skip - I may be being incredibly thick but how does the code you provided work - doesn't seem to be fired when the sheet is deactivated....
Stoffel24 - unfortunately, you cannot use activesheet.name as the sheet has been DEactivated - you tyherefore have to use Me.Name as the parent object is still the sheet that has just been deactivated Rgds
Geoff
"Some cause happiness wherever they go; others whenever they go."
-Oscar Wilde