Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Por Leonardo1234
Posts
#60284
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.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Strogonoff
Posts Avatar
#60309
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
Por osvaldomp
#60318
Código: Selecionar todos
Sub 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
Bikke agradeceu por isso
Por Leonardo1234
Posts
#60366
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.
Você não está autorizado a ver ou baixar esse anexo.
Por Leonardo1234
Posts
#60368
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.
Por Leonardo1234
Posts
#60374
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.
Por osvaldomp
#60376
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 todos
Sub 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
Editado pela última vez por osvaldomp em 10 Nov 2020 às 14:19, em um total de 1 vez.
Leonardo1234, Bikke agradeceu por isso
Por Leonardo1234
Posts
#60577
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.
Você não está autorizado a ver ou baixar esse anexo.
Por osvaldomp
#60616
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 todos
Sub 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
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord