Voltou e viu que ninguém postou uma solução VBA ainda. Pensei em colocar um lá fora.
'indexes of the values stored as an array in the collection object
Private Const USERNAME As Integer = 0
Private Const DATETIME As Integer = 1
'references to where the data is or should be in the workbook
Public Enum DataColumns
DateTimeStamp = 1
UName = 2
Department = 3
LastUpdater = 4 'The information we will be adding!
End Enum
Sub Main()
Dim lastUserByDept As Collection
Set lastUserByDept = GetLastUpdater(2)
AppendLastUserName 2, lastUserByDept
End Sub
'//Builds a collection of department entries, and stores
'//the last date along with the user tied to that date
Private Function GetLastUpdater(dataStartRow As Long) As Collection
Dim currRow As Integer: currRow = dataStartRow
Dim maxDatesByDept As Collection
Set maxDatesByDept = New Collection
Dim deptInfo As Variant
Do While Not IsEmpty(Cells(currRow, DataColumns.DateTimeStamp))
Dim dept As String: dept = Cells(currRow, DataColumns.Department).Value
If DeptExists(maxDatesByDept, dept) Then
If Cells(currRow, DataColumns.DateTimeStamp).Value > maxDatesByDept.Item(dept)(DATETIME) Then
deptInfo = Array(Cells(currRow, DataColumns.UName).Value, Cells(currRow, DataColumns.DateTimeStamp).Value)
UpdateExistingEntry maxDatesByDept, deptInfo, Cells(currRow, DataColumns.Department)
End If
Else
deptInfo = Array(Cells(currRow, DataColumns.UName).Value, Cells(currRow, DataColumns.DateTimeStamp).Value)
maxDatesByDept.Add deptInfo, Cells(currRow, DataColumns.Department).Value
End If
currRow = currRow + 1
Loop
Set GetLastUpdater = maxDatesByDept
Set maxDatesByDept = Nothing
Função final
'// Como estamos usando o objeto de coleção VBA, não há verdade
// testa para se um elemento existe; a coleção só vai jogar
'// um erro se você pedir algo que não pode encontrar, então apenas
// interceptar o erro e retornar falso nesse caso, pois significa que não
'// item foi encontrado na lista com esse departamento como chave
Função Privada DeptExists (ByRef deptList como Collection, dept As String) As Boolean
No manipulador Error GoTo
deptList.Item dept
DeptExists = True
Sair da função
manipulador:
Err.Clear
DeptExists = False
Função final
'// Atualiza uma entrada existente em nossa coleção de usuários do departamento.
'// Nota: esta implementação permite o trapping de tentativas falhadas
'// mas não é usado nesta versão para mantê-lo tão simples quanto
// possível - Se era importante saber quando tais tentativas falharam, você
'// poderia capturar o valor de retorno desse método e obter o valor apropriado
'//açao.
Função privada UpdateExistingEntry (ByRef deptList como coleção, ByVal deptInfo como Variant, ByVal dept como String) como Boolean
No manipulador Error GoTo
If DeptExists(deptList, dept) Then
deptList.Remove dept
deptList.Add deptInfo, dept
UpdateExistingEntry = True
Else
UpdateExistingEntry = False
End If
Exit Function
manipulador:
Err.Clear
UpdateExistingEntry = False
Função final
'// Usa a coleção criada de dept, username para adicionar o
'// requer nome de usuário para a coluna
Private Sub AppendLastUserName (dataStartRow como longo, deptListing como coleção)
Dim currRow As Integer: currRow = dataStartRow
Do While Not IsEmpty (Células (currRow, DataColumns.DateTimeStamp))
Dim currDept As String: currDept = Células (currRow, DataColumns.Department)
Células (currRow, DataColumns.LastUpdater) .Value = deptListing (currDept) (NOME DE USUÁRIO)
currRow = currRow + 1
Loop
End Sub
Este código colocará o nome de usuário da última pessoa para atualizar o sistema dentro do contexto do departamento.
Observe que isso pressupõe algumas coisas, como os locais das colunas; Há uma Enumeração sendo usada para referenciar as colunas relevantes, então você pode apontá-las para os índices de coluna apropriados se elas diferirem do exemplo e todas funcionarem conforme o esperado. Ele também pressupõe que a coluna que contém o registro de data não possui intervalos e é sempre uma data.
Copie e cole todo o conjunto de códigos em um único módulo no Excel e ele funcionará muito bem.