boa tarde,
Estou trabalhando em uma planilha do Excel onde tenho uma tabela de dados. Esses dados representam várias métricas que meu departamento deseja acompanhar. Sempre que alguém deseja preencher a tabela com novos dados, os dados anteriores nas células são perdidos.
Como alguém pode criar uma planilha separada onde você pode armazenar todos os valores dessa tabela automaticamente? Quer dizer, quando é feita uma alteração em uma das células da tabela, o novo valor será armazenado automaticamente em outra tabela que manterá todos os valores (antigos e novos) das células? Tentei as "mudanças de faixa", mas não tenho certeza se gosto tanto assim.
Alguém conhece uma maneira mais eficiente de fazer isso? Através de uma macro, por exemplo?
Obrigado!
Responder1
(Estou no celular, então não posso fornecer uma resposta muito detalhada no momento.)
Eu escrevi código exatamente para isso. Minha intenção era rastrear todas as alterações em uma planilha crítica editada por vários usuários. Se houvesse uma disputa sobre a origem dos dados, eu poderia revisar o registro. Aqui estão peças VBA que serão úteis.
Worksheet_Change
O evento será acionado sempre que a planilha for alterada.
If Not Intersect(Target, Range("A1:G12")) Is Nothing
dirá se as células que foram alteradas estão ou não dentro de algum intervalo de seu interesse.
É mais rápido armazenar os valores que você deseja registrar em uma matriz e definir um intervalo em sua planilha de registro para ser igual a essa matriz, em vez de definir cada célula na planilha de registro individualmente.
Dê uma facada e veja até onde você chega. Posso ser um pouco mais detalhado amanhã.
Edição do dia seguinte
Aqui está um código que observará o intervalo A1:G12
em qualquer planilha que contenha o código. Se r
for a linha que foi alterada, o código copiará tudo Ar:Gr
em uma planilha cujonome de códigoé shtLog
. (O nome do código é o nome mostrado no VBA, não o nome na guia que você vê no Excel.) Isso deve ajudá-lo a seguir na direção certa.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
Dim c As Integer
Dim arr(1 To 1, 1 To 12)
If Not Intersect(Target, Range("A1:G12")) Is Nothing Then
r = Target.Row
For c = 1 To 12
arr(1, c) = Cells(r, c).Value
Next
With shtLog
.Range(.Cells(.UsedRange.Rows.Count + 1, 1), .Cells(.UsedRange.Rows.Count + 1, 12)) = arr
End With
End If
End Sub
Responder2
A funcionalidade integrada "Rastrear alterações" provavelmente será muito mais robusta do que qualquer controle de alterações que você tente implementar com macros. Fique com isso.
Responder3
Nós (isenção de responsabilidade, sou o fundador) construímos um sistema de trilha de auditoria para Excel (como o Google Docs faz, mas para Excel). Não requer uma pasta de trabalho compartilhada e a trilha de auditoria é salva em um banco de dados SQL local para que possa ser acessada de qualquer pasta de trabalho e salva como uma planilha separada. Dar uma olhada:http://www.officeautomata.com
Responder4
Com o recurso Anexar do Sheetgo você pode salvar e manter um registro histórico de alterações de variáveis no Excel. Mais informações nesta postagem do blog:https://blog.sheetgo.com/how-to-solve-with-sheetgo/track-changes-in-excel-files/(*isenção de responsabilidade: sou cofundador da Sheetgo).