Я написал следующий код в кодовой таблице VBA.

Private Sub Workbook_Open() MsgBox («Добро пожаловать в трекер» и приложение.UserName) End Sub

Результат «Добро пожаловать в трекер, Сакарай, Киран»

Я хочу отслеживать нижеприведенные детали на одном из листов, когда пользователь открывает лист.

Имя пользователя Дата и время Изменения

Пожалуйста, помогите мне. Спасибо

1 ответ1

1

Я нашел ответ на этот вопрос в другом месте, но не могу найти эту ссылку прямо сейчас, поэтому я дам вам решение, которое я использую в настоящее время. Для моего проекта я хочу, чтобы лист 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   

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .