Notifications
Clear all

Não deixar apagar infomação depois de inserida.

15 Posts
4 Usuários
0 Reactions
3,558 Visualizações
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Olá prezados colegas bom dia!

Tenho uma dúvida referente a excel e resolvi postar no fórum pois pesquisei e não encontrei algo a respeito.
Será que existe uma forma de não deixar um usuário expecífico apagar a infomação inserida em uma célula ou fazer aparecer em alguma parte da planilha o horário e data que determinada célula foi alterada?

Espero que alguém possa me ajudar com este problema.

Desde já agradeço.

Abraços

 
Postado : 19/09/2013 5:51 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Fabiosp,

Bom Dia!

Já tentou proteger a planilha com senha?

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 19/09/2013 7:15 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Olá Wagner Morel

Sim, tem senha em minha planilha.
O problema e que todos os membros tem que acessar essa planilha para consulta ou inserir dados adicionais.
Tem alguem que esta apagando os dados e inseridos dados em local errado.
Por este motivo postei meu problema no fórum.

Muito obrigado pela dica.

Fabiosp,

Bom Dia!

Já tentou proteger a planilha com senha?

 
Postado : 19/09/2013 7:27 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

De uma lida em viewtopic.php?f=10&t=3438&p=15984&hilit=*altera*#p15984
Talvez auxilie

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

 
Postado : 19/09/2013 7:29 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

De uma olhada no tópico abaixo, temos um arquivo que grava em um arq texto as alterações efetuadas.

Application.FileSearch - EXCEL 2007
Log Alteracao
viewtopic.php?f=10&t=1826&start=10

[]s

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

 
Postado : 19/09/2013 8:31 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Reinalado
Muito obrigado!
Vou dar uma olha para ver se tem o que necessito.

Abraços.

De uma lida em viewtopic.php?f=10&t=3438&p=15984&hilit=*altera*#p15984
Talvez auxilie

 
Postado : 19/09/2013 8:52 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Mauro Coutinho Boa Tarde

Muito obrigado pela dica.
Tentei baixar o arquivo, porém quando vou descompactar saiu um aviso informando que o arquivo esta corrompido.
Esse arquivo e em versão 2007?
Eu utilizo a versão 2003.

Desde já agradeço

Abraços

De uma olhada no tópico abaixo, temos um arquivo que grava em um arq texto as alterações efetuadas.

Application.FileSearch - EXCEL 2007
Log Alteracao
viewtopic.php?f=10&t=1826&start=10

[]s

 
Postado : 19/09/2013 8:56 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Bom dia Reinaldo e a todos colegas deste fórum.

Eu testei a rotina que foi postada no link adicionado pelo Reinaldo e até certo ponto deu certo, porém necessito que apareça também o nome do usuário.
Serà que tipo adicionando Application.UserName nesta rotina é possivél sair na plan historia o user name?
Outra questão, quando sai a célula que foi alterada sai tipo célula prendida A$1 não teria uma forma de sair com A1
creio que assim e mais fácil visualizar.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim wsHist As Worksheet, Rng As Range
    Set wsHist = Sheets("História")
    If Sh Is wsHist Then Exit Sub
    Set Rng = wsHist.Range("A" & Rows.Count).End(xlUp).Offset(1)
    With Rng
        .Value = Now
        .Offset(, 1) = Sh.Name
        .Offset(, 2) = Target.Address
        If Target.Cells.Count > 1 Then
            .Offset(, 3) = "Valores Alterados"
        Else
            .Offset(, 3) = Target.Formula
        End If
    End With
End Sub

Desde já agradeço e desculpe fazer tanta perguntas.

Abraços.

 
Postado : 20/09/2013 4:48 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro Coutinho Boa Tarde

Muito obrigado pela dica.
Tentei baixar o arquivo, porém quando vou descompactar saiu um aviso informando que o arquivo esta corrompido.
Esse arquivo e em versão 2007?
Eu utilizo a versão 2003.

Desde já agradeço

Abraços

Fabio, depois atualizo o arquivo, mas no Foum abaixo temos o Arquivo tanto para v 2003 como 2007, pode baixar estes que estão funcionando.
Log com as Alterações nas Planilhas v 2003 - v 2007
http://www.tomasvasquez.com.br/forum/vi ... jwsc9gZF1E

[]s

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

 
Postado : 20/09/2013 5:18 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Mauro Coutinho

Muito obrigado!!
Vou verificar e qualquer coisa retorno.
Apenas uma pergunta.
Nesse arquivo é possível obter o nome do usuário que alterou a informação da célula?

Abraços.

Mauro Coutinho Boa Tarde

Muito obrigado pela dica.
Tentei baixar o arquivo, porém quando vou descompactar saiu um aviso informando que o arquivo esta corrompido.
Esse arquivo e em versão 2007?
Eu utilizo a versão 2003.

Desde já agradeço

Abraços

Fabio, depois atualizo o arquivo, mas no Foum abaixo temos o Arquivo tanto para v 2003 como 2007, pode baixar estes que estão funcionando.
Log com as Alterações nas Planilhas v 2003 - v 2007
http://www.tomasvasquez.com.br/forum/vi ... jwsc9gZF1E

[]s

 
Postado : 20/09/2013 5:39 am
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Boa Noite prezados colegas.

Depois de muita luta consegui adaptar a rotina em minha planilha, porém necessito que apareça o valor antigo e valor novo.
No momento só aparece o valor novo(valor alterado) pesquisei na net e não encontrei uma solução para meu problema.
Se possível gostaria da ajuda dos senhores mestre do VBA membros deste admirável fórum.
Abaixo segue a minha rotina.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim wsHist As Worksheet, Rng As Range
    Set wsHist = Sheets("Historia")
    If Sh Is wsHist Then Exit Sub
    Set Rng = wsHist.Range("A" & Rows.Count).End(xlUp).Offset(1)
    With Rng
        .Value = Format(Now, "dd-mm-yy hh:mm:ss")
        .Offset(, 1) = Sh.Name
        .Offset(, 2) = Target.Address(False, False)
        If Target.Cells.Count > 1 Then
            .Offset(, 3) = "Valores Alterados"
        Else
            .Offset(, 3) = Target.Formula
            .Offset(, 4) = Environ("USERNAME")
        End If
    End With
End Sub

Desde já agradeço a ajuda de todos colegas deste fórum.

Abraços.

 
Postado : 21/09/2013 8:07 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Fabio, fiz as adaptações referentes aos modelos que lhe indiquei, para gravarem em uma aba todas alterações, inclusive nome do usuário e maquina que realizou a operação.

Eu só gostaria de ressaltar que na minha opinião o metodo de gravar em um arquivo texto separado seria bem melhor pelos fatos de :
1°) As alterações são gravadas em uma aba separada, neste caso, esta aba teria de estar oculta e protegida;
2°) Dependendo da quantidade diaria de alterações, vai chegar um momento em que o arquivo irá ficar enorme, podendo influenciar no desempenho.

Lógicamente, que se optar por gravar em um arquivo separado (texto) este deverá ficar em um local em que somente você saiba e tenha acesso, óbviamente o caminho teria de estar na rotina e se o projeto nãoestiver protegido, outros com um pouco mais de experiencia e máfé poderãoalterar, mas isto é outra questão, pois como já foi discutido em vários Foruns e aqui tambem, é impossível obtermos 100% de segurança.

Seja qual for a sua opção, segue o modelo onde as alterações são gravadas na propria pasta.

Gravar as alterações em aba separada

Faça os testes e veja se é isto.

[]s

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

 
Postado : 22/09/2013 4:42 pm
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Boa noite Mauro Coutinho,

Desculpe pelo incomodo em pleno domingão.rs
Testei a rotina indicada e fiz as adaptações necessárias e agora esta tudo funcionando perfeitamente.
Muito obrigado pela ajuda.
Creio que não haverá muitas alterações para serem feitas na planilha, por isso optei em deixar as informações para serem gravadas em uma aba oculta e protegida.
Tenho esperança que não exista mais de uma pessoa de máfé lá na empresa.rs
Como você disse, é impossível obtermos 100% de segurança, desta forma concordo com sua opinão de que gravar o log em um arquivo separado seja a melhor alternativa.
Testei o arquivo que grava separado também e achei interessante.
Deixei preparado para caso seja necessário utilizá-lo
Novamente agradeço a sua colaboração caro colega.
Abraços.

 
Postado : 22/09/2013 6:35 pm
(@fabiosp)
Posts: 291
Reputable Member
Topic starter
 

Mauro Coutinho Bom Dia.

Muito obrigado por ajudar neste caso.
Estou utilizando a rotina que você criou aqui no trabalho, porém surgiu uma dúvida.
Desculpe incomodar mesmo depois de colocar o tópico como resolvido, mas minha dúvida e o seguinte.
Este código não identifica informações de combo box?
Quando é alterado valores em campos onde tem combo box aparece que informação interior e vazia e foi alterado para valor x sendo que na célula tinha informação.
Se possível poderia explicar o que causa isso?

Desde já agradeço e peço desculpas pelo incomodo.

Abraços

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ActiveWorkbook.Save
End Sub


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim I As Integer
    Dim wsLog As Worksheet
    
    Set wsLog = Sheets("Log") 'pasta onde sera gravado o log de alteracoes
    'Se a alteracao for feita na Aba Log, sai da rotina
    If Sh Is wsLog Then Exit Sub
    
    For I = 1 To Target.Count
        Log I, Target(I).Value, Target(I).Address(False, False), ActiveSheet.Name
    Next I
End Sub


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim I As Integer
    'Armazena o Valor anterior
    ReDim GlbValorAntigo(Target.Count)
    
    For I = 1 To Target.Count
        GlbValorAntigo(I) = Target(I)
    Next I

End Sub

Global GlbValorAntigo() As String

'rotina para capturar os nomes da maquina e usuario
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _
                                                nSize As Long) As Long

Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
                                                        (ByVal lpBuffer As String, _
                                                        nSize As Long) As Long



Public sQualPlanilha
Public sQualEnde
Public sGlbValorAntigo
Public sNewValue


Sub Log(Pos As Integer, NewValue, QualEnde, QualPlanilha As String)

    On Error Resume Next

    If GlbValorAntigo(Pos) = Empty Then
        GlbValorAntigo(Pos) = "VAZIO"
    End If

    If NewValue = Empty Then
        NewValue = "VAZIO"
    End If

    If NewValue = GlbValorAntigo(Pos) Then
        Exit Sub
    End If

   'Armazena nas Variaveis as alteracoes
    sQualPlanilha = QualPlanilha
    sQualEnde = QualEnde
    sGlbValorAntigo = GlbValorAntigo(Pos)
    sNewValue = NewValue

    Call lancarLog

    GlbValorAntigo(Pos) = Empty
    
End Sub


Sub lancarLog()
    
    Dim Comp_Name_B As String * 255
    Dim lpBuff As String * 25

    GetComputerName Comp_Name_B, 255
    Comp_Name = Left(Comp_Name_B, InStr(Comp_Name_B, Chr(0)) - 1)
    
    GetUserName lpBuff, 25
    UserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)

    Dim swLog As Worksheet
    Set swLog = Worksheets("Log")
    
    Set Rng = swLog.Range("A" & Rows.Count).End(xlUp).Offset(1)

    With Rng
        .Value = Now                       'data / Hora
        .Offset(, 1) = sQualPlanilha       'nome da Aba onde o dado foi alterado
        .Offset(, 2) = sQualEnde           'endereco da celula alterada
        .Offset(, 3) = UserName            'nome do usuario logado no PC
        .Offset(, 4) = Comp_Name           'maquina utilizada pelo usuario
        .Offset(, 5) = sGlbValorAntigo        'Valor Anterior
        .Offset(, 6) = sNewValue           'Valor Atual
    End With
   
End Sub
 
Postado : 24/09/2013 7:34 am
(@ryane)
Posts: 3
New Member
 

Bom Dia!

Para bloquear as células, primeiramente você precisa selecionar todas as células da aba que você quer e clicar com o botão direito do mouse, formatar células, selecionar a aba Proteção e desmarcar a caixa de seleção Bloqueadas. Ou seja, todas as suas células passarão a ser desbloquedas quando você proteger (obviamente, com senha) a sua planilha.

Depois você vai até a Guia Revisão, Painel Alterações, botão Proteger Planilha, desmarca apenas a caixa de seleção "Selecionar células bloqueadas" e escolhe, por exemplo uma senha para efetivar a proteção. Essa senha deverá ser utilizada no código abaixo que fará o bloqueio e desbloqueio da planilha para que uma célula fique bloqueada após a digitação nela. Veja que eu utilizei a senha "123".

Feito tudo isso, você agora abre a IDE do VBA (ALT + F11) e na janela VBAProject que aparece no canto esquerdo da sua tela você dá um clique duplo em cima da planil ha que você quer que as células sejam bloquedas (no caso, a mesma que você já fez o procedimento acima). Isso fará surgir a janela de edição de código do lado direito da sua tela. Essa janela possui duas caixas combo na parte de cima. Clique na seta do combo da esquerda e selecione o objeto Worksheet. Isso fará o VBA inserir duas linhas de código na janela de edição. Esse é o evento SelectionChange da sua planilha. Observe que o cursor fica piscando dentro das duas linhas de código. Agora você seleciona o combo da direita e escolhe o evento Change. Novamente o VBA vai inserir duas linhas de código, agora referente ao evento Change da sua planilha. Você pode copiar todo o código abaixo e depois selecionar todas essas linhas que surgiram na janela de edição do VBA e colar o código copiado em cima. Salve tudo, feche a ide do VBA e pronto! Suas células serão bloqueadas sempre que você digitar algo nelas.
Código:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
ActiveSheet.Unprotect ("123")
Target.Locked = True
ActiveSheet.Protect ("123")
Application.EnableEvents = True
End Sub

Neste caso as células após serem preenchidas são bloqueadas automáticamente

 
Postado : 09/12/2013 6:16 am