Você poderia usar um objeto com no AutoHotkey, mas eu não recomendaria fazer isso dessa maneira.
Se você colocar uma macro Worksheet_Change()
em sua planilha, o Excel a avaliará sempre que você inserir algo manualmente (ou seja, quando você atualizar uma célula ou alterá-la). A macro receberá o objeto Range da (s) célula (s) modificada (s); portanto, a partir do objeto de intervalo, você pode obter a linha e a coluna. Se a coluna é uma coluna que você gosta (no seu caso, coluna K
), então você usa a mesma linha e uma coluna diferente (no seu caso, coluna N
) para inserir a hora. A macro Worksheet_Change()
será chamada para todas as atualizações de planilha toda vez que uma célula for alterada, por isso é importante distinguir com quais colunas você se importa, pois a rotina também será executada para quaisquer atualizações nas colunas com as quais você não se importa também. / p>
O exemplo de código abaixo deve ser fácil para você se adaptar. Ele é projetado com algumas variações que você pode remover e adaptar à sua situação.
- Ele é projetado para inserir a data, não o horário ... que é fácil de alterar
- Ele é projetado para acionar várias colunas, não apenas uma coluna
- Para permitir flexibilidade no reprojeto da planilha ou movimentação de colunas, ela não é codificada para uma determinada coluna, por exemplo,
K
ouN
.
Descrição do item 3 em detalhes:
- O código não depende de valores de endereço de coluna codificados
- Em vez disso, ele conta com a primeira linha
MyRange = Range("1:1")
sendo uma linha de cabeçalho (que geralmente também é legal) - Quando a linha do cabeçalho é definida (ou seja, codificada como linha
1
), ela encontra os cabeçalhos da coluna que são importantes para acionar uma atualização - Depois de encontrar esses cabeçalhos de coluna, ele verifica se a célula que mudou estava em uma dessas colunas
- Se a célula estava em uma dessas colunas, a data é inserida
Essa configuração permite usar uma linha de cabeçalho rotulada na primeira linha e mover as colunas mais tarde à vontade (inserir ou excluir colunas em qualquer lugar) e ainda ter a inserção automática funcionando corretamente, mesmo se as células de que você gosta não mais no mesmo K
ou N
localizações da coluna por mais tempo. Se você não se importar com isso, é claro, você pode simplesmente deixar sua planilha sem cabeçalhos, retirar o código WorksheetFunction.Match
e usar endereços de coluna codificados.
Para usar este código, abra o editor do VBA - normalmente haverá uma árvore à esquerda mostrando VBAProject (Filename) com uma subpasta para Microsoft Excel Objects e sub-itens para cada uma das três folhas (por padrão em uma nova pasta de trabalho), bem como ThisWorkbook. Clique duas vezes na Planilha na qual deseja trabalhar e insira a função Worksheet_Change()
abaixo para poder usá-la e editá-la para essa planilha.
Private Sub Worksheet_Change(ByVal Target As Range)
'Do nothing if more than one cell is changed or content deleted
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
'Debug.Print Time
MyRange = Range("1:1")
TotalColumn = Application.WorksheetFunction.Match("Total", MyRange, 0) 'exact match, row 1
ProjectColumn = Application.WorksheetFunction.Match("Project", MyRange, 0) 'exact match, row 1
DescriptionColumn = Application.WorksheetFunction.Match("Description", MyRange, 0) 'exact match, row 1
If Target.Column = TotalColumn Then ' If Total gets updated, then update the Total change date
DateColumn = Application.WorksheetFunction.Match("Date Last Total Change", MyRange, 0) 'exact match, row 1
'MsgBox DateColumn
' ------------------------------------------------
' EnableEvents not required, but keeps this routine from being called again
' ------------------------------------------------
Application.EnableEvents = False
'Update field with Date of last update
ActiveSheet.Cells(Target.Row, DateColumn).Value = Date
Application.EnableEvents = True ' re-enable events
' ------------------------------------------------
End If
If (Target.Column = TotalColumn) Or (Target.Column = ProjectColumn) Or (Target.Column = DescriptionColumn) Then
DateColumn1 = Application.WorksheetFunction.Match("Date", MyRange, 0) 'exact match, row 1
' Update the open date if it's empty, otherwise leave it alone
If ActiveSheet.Cells(Target.Row, DateColumn1).Value = "" Then
ActiveSheet.Cells(Target.Row, DateColumn1).Value = Date
End If
End If
End Sub