Página 1 de 1
PROTEÇÃO DA PLANILHA
Enviado: 06 Nov 2020 às 13:33
por Leonardo1234
Pessoal,
Eu queria saber se existe alguma forma de permitir o comando "inserir linhas de uma tabela" dentro de uma planilha protegida. O máximo que eu consegui foi permitir inserir a linha toda deixando o comando inserir linha habilitado dentro da caixa de ativação da proteção, porém na verdade o que eu preciso é inserir a linha apenas da tabela selecionada, sem influenciar no numero de linha de outras tabelas que estão na mesma aba da planilha e compartilham das mesmas linhas da aba.
Para ficar mais claro, vou utilizar um exemplo. Na aba base da minha planilha, que é onde eu de fato preciso dessa aplicação, quando a planilha está desprotegida, se eu clicar com o botão direito na célula D5, que está dentro da tabela CL, e dentro do comando inserir, selecionar Linha da Tabela Acima, a linha acrescentada se aplicará apenas à tabela CL, sem influenciar no numero de linhas das tabelas ao lado, porém com a planilha protegida isso não é possível, já que a parte Linha da Tabela Acima fica bloqueada.
Como eu não vi na caixa de proteção alguma opção que habilitasse esse caso, eu imagino que a unica forma de resolver isso é através de uma macro. Agradeço muito se alguém conseguir me ajudar.
Segue a planilha em anexo. A aba Base está protegida, porém sem senha.
Re: PROTEÇÃO DA PLANILHA
Enviado: 07 Nov 2020 às 13:47
por Strogonoff
Amigo
Boa tarde!!!
A resposta é sim, existe um comando para trabalhar com planilhas protegidas.
como você especificou terá que ser uma Macro.
o comando seria:
Sub InsereLinha()
ActiveSheet.Protect Password:="12345", UserInterfaceOnly:=True
Sheets("Base").Select
Selection.ListObject.ListRows.Add (6)
End Sub
Porém você tem uma proteção na planilha Base que terá que ser modificada ( no target) e adaptada para essa nova linha. Talvez uma funçao IF.
Espero ter ajudado..
Abraço
Re: PROTEÇÃO DA PLANILHA
Enviado: 07 Nov 2020 às 16:10
por osvaldomp
Código: Selecionar todosSub InsereLinhaEmTabela()
On Error GoTo fim
If ActiveCell.ListObject <> "" Then
ActiveSheet.Unprotect
Range(ActiveCell.ListObject.Name).ListObject.ListRows.Add
ActiveSheet.Protect
End If
fim:
End Sub
1. selecione qualquer célula da Tabela de interesse e rode o código acima
2. acrescente a linha em vermelho, conforme abaixo, no código existente no módulo da planilha
Base
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
Re: PROTEÇÃO DA PLANILHA
Enviado: 09 Nov 2020 às 10:22
por Leonardo1234
Opa Pessoal,
Obrigado pela ajuda. Osvaldomp, eu utilizei seu código e está funcionando. Só tem um ponto que talvez eu nao deixei claro no tópico. Quando eu rodar a macro, a linha inserida deve ser acrescentada acima da célula selecionada da tabela, assim como ocorre normalmente ao se inserir uma linha na planilha. Exemplo: Ao selecionar a célula E4, que está dentro da tabela CL, a nova linha que se acrescentar da tabela deve estar entre a linha 3 e a linha 4. Hoje a linha está sendo adicionada na ultima linha da tabela, independente de qual célula estiver selecionada. Com isso ajustado, fica perfeito. Mais uma vez, muito obrigado pela ajuda. Vou mandar a planilha novamente, caso precise.
Re: PROTEÇÃO DA PLANILHA
Enviado: 09 Nov 2020 às 10:31
por Leonardo1234
Osvaldo_mp, eu notei um outro problema da macro. Depois que ela roda a planilha permanece protegida, porém sem senha. Eu precisaria que ela permanecesse protegida com a senha original. A senha que eu estou utilizando é "131077", caso precise. Obrigado.
Re: PROTEÇÃO DA PLANILHA
Enviado: 09 Nov 2020 às 11:24
por Leonardo1234
Só mais uma observação, todo o processo de desproteger e proteger a planilha, o ideal seria de ocorrer de forma oculta dentro da própria macro para deixar a senha oculta na planilha.
Re: PROTEÇÃO DA PLANILHA
Enviado: 09 Nov 2020 às 18:21
por osvaldomp
Experimente este código no lugar do anterior.
Lembrando que para impedir o livre acesso à senha o Projeto VBA deverá ser bloqueado:
Ferramentas |
Propriedades ... |
Proteção
Código: Selecionar todosSub InsereLinhaEmTabela()
On Error GoTo fim
If ActiveCell.ListObject <> "" Then
ActiveSheet.Unprotect "131077"
Range(ActiveCell.ListObject.Name).ListObject.ListRows.Add ActiveCell.Row - 1
ActiveSheet.Protect "131077"
End If
fim:
End Sub
Re: PROTEÇÃO DA PLANILHA
Enviado: 10 Nov 2020 às 14:15
por Leonardo1234
Cara, muito obrigado. Está funcionando perfeitamente.
Re: PROTEÇÃO DA PLANILHA
Enviado: 17 Nov 2020 às 17:46
por Leonardo1234
Olá Osavldo_mp, tudo bem?
Cara, preciso da sua ajuda, a macro que vc desenvolveu nesse topico parou de funcionar inesperadamente para uma das tabelas da planilha. Você consegue verificar o que está ocorrendo? É na tabela CL na aba base, que ela parou de funcionar. Nas outras tabelas, a macro está funcionando normal.
OBS: Conforme foram sendo adicionadas linhas na tabela CL, a macro ficou cada vez mais lenta, mesmo com o arquivo não ficando tão pesado, ele está com 315 KB. Não sei se isso pode estar influenciando tb mas se vc conseguir deixar ela mais rapida, também seria muito bom.
Valeuuu, agradeço demais se conseguir me ajudar.
Re: PROTEÇÃO DA PLANILHA
Enviado: 18 Nov 2020 às 16:53
por osvaldomp
Leonardo1234 escreveu: ↑17 Nov 2020 às 17:46
É na tabela CL na aba base, que ela parou de funcionar.
O Excel não permite inserir linha na Tabela se o Auto Filtro estiver aplicado e na coluna A o Auto Filtro está aplicado por isso a macro não insere linha. Nem manualmente é possível. Basta desaplicar o filtro que a macro voltará a inserir linha.
Como opção, eu inseri um comando para desaplicar o Auto Filtro, caso você queira utilizar o código abaixo no lugar do anterior.
OBS: Conforme foram sendo adicionadas linhas na tabela CL, a macro ficou cada vez mais lenta...
A macro não ficou lenta!
O que acontece é que a sua Tabela tem 10 fórmulas em cada linha e atualmente tem 310 linhas, total de 3.100 fórmulas que são recalculadas cada vez que uma linha é inserida na Tabela e com a agravante que 70% das fórmulas são matriciais e fazem referência às colunas inteiras da Tabela. E à medida que a Tabela cresce o tempo de recálculo aumenta.
Faça um teste, passe o cálculo do Excel pra o modo Manual e verifique que o tempo de execução é bem menor, pois o código não precisa aguardar o recálculo das fórmulas.
Ainda, ao abrir o seu arquivo aqui, é exibida mensagem de referência circular. Verifique pois isso pode contribuir para aumentar o tempo de recálculo.
Código: Selecionar todosSub InsereLinhaEmTabela()
If ActiveCell.ListObject Is Nothing Then Exit Sub
ActiveSheet.Unprotect "131077"
On Error Resume Next
ActiveSheet.ShowAllData
Range(ActiveCell.ListObject.Name).ListObject.ListRows.Add ActiveCell.Row - 1
ActiveSheet.Protect "131077", AllowFiltering:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
End Sub