Notifications
Clear all

Checar se houve mudança em uma célula, e escrever a data

8 Posts
1 Usuários
0 Reactions
2,993 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Pessoal,

Consulto um arquivo que é editado por outras pessoas todos os dias. Para não perder tempo checando informações antigas da planilha, a ideia é fazer uma macro para, sempre que alguma linha tiver célula(s) alterada, a data da alteração ficar registrada numa célula vizinha. Dessa maneira, eu posso checar somente as linhas que foram alteradas no dia. Checando na net, vi que existe um recuso chamado timestamp. A macro que eu encontrei segue abaixo.

Sub worksheet_change(ByVal faixa As Range)
Dim dados As Range
    Set dados = Range("A1:E200")
    If Not Intersect(faixa, dados) Is Nothing Then
        Application.EnableEvents = False
        dados.Cells(faixa.Row, 6).Value = Date
        Application.EnableEvents = True
    End If
End Sub

A macro funciona perfeitamente. Qualquer alteração feita no intervalo de dados A1:E200 (Set dados = Range("A1:E200")) pode ser identificada através da data que é escrita na coluna F da linha que sofreu alteração (dados.Cells(faixa.Row, 6).Value = Date). O problema é que, por algum motivo, essa macro não permite desfazer alguma ação na planilha, nem utilizando Ctrl+V, nem clicando no botão Desfazer do menu.

Como essa planilha é editada por outras pessoas, não posso tirar essa opção do arquivo. Alguém tem ideia de como eu posso fazer?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/02/2012 1:07 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

lhbessa,

Essa macro infelismente não aceita desfazer(Pelo menos no intervalo que ela atua"A1:E200")
Vamos esperar a ajuda dos Mestres em macro, mais na minha opinião acho que ñ tem como desfazer não.

Abraço.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/02/2012 3:48 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Realizei algumas pesquisas, e até dizem que se é possivel a criação de rotinas "Undo" atrelada a Eventos das WorkSheets, mas é bem complicado, e pra dizer a verdade, com um grau de dificuldade que dependendo do que se quer fazer ficaria inviável, e até passa dos limites de meua estudos em VBA.

Para se ter um exemplo, no site abaixo tem uma ótima explicação do assunto, e um exemplo para baixar, mas os "undo" e o "ResetUndo" funcionam somente nas alterações efetudas pelas rotinas na mesma, seria o caso de adaptar, mas em algumas tentativas, não obtive sucesso, então fica ai para quem quiser tentar :

Creating An Undo Handler To Undo Changes Done By Excel VBA
http://www.jkp-ads.com/Articles/UndoWithVBA00.asp

Outro link interessante são estes :
http://gmarcan.blogspot.com/2007/09/und ... l-vba.html

Undoing A VBA Subroutine
http://spreadsheetpage.com/index.php/si ... ubroutine/

Temos aqui no forum um exemplo que grava todas as alterações em um arquivo dde Log, bem interessante tambem :
viewtopic.php?f=16&t=1826&hilit=log&start=10

No site abaixo eu cheguei anexar dois modelos, para v 2003 e 2007 :
Log com as Alterações nas Planilhas v 2003 - v 2007
http://www.tomasvasquez.com.br/forum/vi ... 9&start=10

Espero que ajude de alguma forma.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/02/2012 6:24 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bo noite!!!

Se entendi bem esse código faz isso que você quer.

O problema é que ele deve ser adaptado pois, tem uma input box, que talvez não te agradará

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim NewValue As Variant, OldValue As Variant
    If Application.UserName <> "elaoraculo" Then Exit Sub
    If Target.Count > 1 Then Exit Sub
     'Say you want to work with the range A1:F100
    If Not Intersect(Target, Range("A1:F10")) Is Nothing Then
        NewValue = Target.Value
        Application.EnableEvents = False
        Application.Undo
        OldValue = Target.Value
        If OldValue = "" Then
    Target.Value = NewValue
ElseIf InputBox("Caso tenha permição entre com a senha") = "ale" Then
    Target.Value = NewValue
Else: MsgBox "Você não pode alterar o conteudo da celula.", 16, "Células Bloqueadas"
    Target.Value = OldValue
    End If
        Application.EnableEvents = True

Tem uma outra maneira

Veja...terá que adaptar, pois é usado em um botão de um UserFrom

Private Sub CommandButton1_Click()

  If TextBox1.Value = "ale" Then
     ActiveSheet.Unprotect Password:="ale"
          If OptionButton1 Then
             Selection.Locked = False
          Else
             Selection.Locked = True
          End If
      ActiveSheet.Protect "ale", UserInterfaceOnly:=False
  Else
      MsgBox "Sua senha está incorreta,Tente novamente.", vbCritical, "Atenção!"
  End If
  
 Unload Me
 
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/02/2012 6:59 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bo noite!!!

Se entendi bem esse código faz isso que você quer.

O problema é que ele deve ser adaptado pois, tem uma input box, que talvez não te agradará

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim NewValue As Variant, OldValue As Variant
    If Application.UserName <> "elaoraculo" Then Exit Sub
    If Target.Count > 1 Then Exit Sub
     'Say you want to work with the range A1:F100
    If Not Intersect(Target, Range("A1:F10")) Is Nothing Then
        NewValue = Target.Value
        Application.EnableEvents = False
        Application.Undo
        OldValue = Target.Value
        If OldValue = "" Then
    Target.Value = NewValue
ElseIf InputBox("Caso tenha permição entre com a senha") = "ale" Then
    Target.Value = NewValue
Else: MsgBox "Você não pode alterar o conteudo da celula.", 16, "Células Bloqueadas"
    Target.Value = OldValue
    End If
        Application.EnableEvents = True

Tem uma outra maneira

Veja...terá que adaptar, pois é usado em um botão de um UserFrom

Private Sub CommandButton1_Click()

  If TextBox1.Value = "ale" Then
     ActiveSheet.Unprotect Password:="ale"
          If OptionButton1 Then
             Selection.Locked = False
          Else
             Selection.Locked = True
          End If
      ActiveSheet.Protect "ale", UserInterfaceOnly:=False
  Else
      MsgBox "Sua senha está incorreta,Tente novamente.", vbCritical, "Atenção!"
  End If
  
 Unload Me
 
End Sub

Alexandrevba, testei o primeiro código que você postou, fiz as adaptações necessárias, mas o resultado foi semelhante ao obtido com o código que eu postei inicialmente: as alterações são identificadas e a data é escrita numa célula a parte. Mas, no intervalo onde as alterações são feitas, o recurso do "Desfazer" fica desabilitado.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/02/2012 9:18 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Mauro Coutinho, acredito que a sua sugestão, de gerar um arquivo de log com as alterações, resolveria meu problema. A questão é que estou em um ambiente corporativo, e infelizmente a licença do Office que temos é a da versão 2010.

Mas, a aprtir da sua sugestão, fiz outra pesquisa e encontrei esse link:
http://www.tomasvasquez.com.br/blog/microsoft-office/excel-gravando-historico-de-alteracoes-na-planilha

Fiz um teste, e por enquanto está funcionando. Não é exatamente o que eu procurava, mas dá pra quebrar o galho. Vou utilizar durante alguns dias, e volto pra dizer se o problema foi resolvido ou não.

Grato.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/02/2012 9:22 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom dia!!!

Imagine a seguinte informação.

Tenho várias pessoa para usar um único arquivo, mas somente delas poderar alterar os dados.

É isso que a rotina faz, mas creio não deve resolver seu problema...

Não faz sentido eu privar a entrada de dados com a opção desfazer habilitada.

Att..

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/02/2012 9:36 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Mauro Coutinho, acredito que a sua sugestão, de gerar um arquivo de log com as alterações, resolveria meu problema. A questão é que estou em um ambiente corporativo, e infelizmente a licença do Office que temos é a da versão 2010.

Mas, a aprtir da sua sugestão, fiz outra pesquisa e encontrei esse link:
http://www.tomasvasquez.com.br/blog/microsoft-office/excel-gravando-historico-de-alteracoes-na-planilha

Fiz um teste, e por enquanto está funcionando. Não é exatamente o que eu procurava, mas dá pra quebrar o galho. Vou utilizar durante alguns dias, e volto pra dizer se o problema foi resolvido ou não.

Grato.

Pessoal, já estamos utilizando a planilha a alguns dias, e o exemplo do link acima resolveu o meu problema. Por enquanto, está funcionando perfeitamente bem, e é uma opção muito interessante para saber as alterações que são feitas no arquivo do Excel.

Sobre a questão de habilitar o recurso "Desfazer": os usuários comuns geralmente utilizam este recurso para cancelar alguma ação, ainda mais quando lidam com planillhas muito grandes, com muitos dados. Não permitir a utilização do recurso pode gerar insatisfação, além de correr o risco de apagar/substituir informação importante de alguma célula. A questão não é privar a entrada de dados, mas sim ter um controle sobre a data em que as alterações forem feitas.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 13/02/2012 7:32 am