Я нашел ответ на этот вопрос в другом месте, но не могу найти эту ссылку прямо сейчас, поэтому я дам вам решение, которое я использую в настоящее время. Для моего проекта я хочу, чтобы лист UserAccess заполнялся каждый раз, когда пользователь открывает книгу, но вы можете легко изменить его, чтобы обновлять лист в любое время, когда пользователь обращается к листу, как описано ниже.
Если вы хотите пользовательское имя пользователя Excel, приложение.UserName работает нормально. Если вам нужно его имя пользователя Windows, вы должны поместить функцию в модуль, чтобы получить имя пользователя Windows:
Declare PtrSafe Function Get_User_Name Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Затем в ThisWorkbook, я поставил следующую функцию
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
Если вы предпочитаете, чтобы макрос выполнялся при обращении к листу (как вы упомянули в своем вопросе), вы можете изменить вышеописанную функцию и поместить ее в область кода рабочего листа в 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