Eu encontrei isso respondido em outro lugar, mas não consigo encontrar essa referência agora, então vou dar a solução que estou usando no momento. Para o meu projeto, quero que uma planilha de UserAccess seja preenchida sempre que um usuário abrir a planilha, mas você pode facilmente modificá-la para atualizar uma planilha sempre que um usuário acessar a planilha, conforme explicado abaixo.
Se você quiser o nome de usuário do usuário, o Application.UserName funciona bem. Se você quer o nome de usuário do windows, você tem que colocar uma função em um módulo para obter o nome de usuário do windows:
Declare PtrSafe Function Get_User_Name Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Então, no ThisWorkbook, eu coloco a seguinte função
Private Sub Workbook_Open()
Dim wsTemp As Worksheet
Dim bFound As Boolean
Dim NxRow As Integer
'First check to see if the UserAccess sheet exists
For Each wsTemp In Worksheets
If wsTemp.Name Like "UserAccess" Then bFound = True: Exit For
Next
'If it doesn't exist, add it
If bFound = False Then Sheets.Add.Name = "UserAccess"
With Sheets("UserAccess")
'I like to keep this sheet protected from users editing it, so I unprotect it here first
.Unprotect "t/c,Anm.QXz;D#9KL@Z$"
'Find the last empty row on this sheet
NxRow = .Cells(65536, 1).End(xlUp).Row + 1
'Fill the cells with data
.Cells(NxRow, 1).Value = Module1.GetUserName 'this is from the function in Module1
.Cells(NxRow, 2).Value = DateTime.Now
'Re-protect the sheet
.Protect "t/c,Anm.QXz;D#9KL@Z$", UserInterfaceOnly:=True
End With
End Sub
Se você preferir que a macro fosse executada quando a planilha fosse acessada (como você mencionou na sua pergunta), você poderia modificar a função acima e colocá-la na área de código da planilha no VBA:
Private Sub Worksheet_Activate()
Dim NxRow As Integer
With ActiveSheet
'Find the last empty row on this sheet
NxRow = .Cells(65536, 1).End(xlUp).Row + 1
'Fill the rows with data
.Cells(NxRow, 1).Value = Application.UserName
.Cells(NxRow, 2).Value = DateTime.Now
End With
End Sub