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
  • Avatar do usuário
#63904
Boa tarde

Preciso de ajuda para o seguinte:
Tenho a Planilha "DATA" que está protegida do seguinte modo :
Código: Selecionar todos
ws.Protect Password:="123", UserInterFaceOnly:=True
de modo a permitir escrever dados via VBA.
O que de momento acontece é que eu consigo escrever dados, só na linha 7 e entre as colunas G e Z.
Ao fazer Double_Click no range que acima refiro aparece uma Userform com uma ListBox contendo os dados disponíveis que posso escolher.

Ao escolher da ListBox um valor ele escreve na respetiva célula e tb adiciona na tab "SETTINGS" o valor e a data, às colunas R e S.

Até aqui tudo, quase, bem, já que me aparece a mensagem de erro de estar a escrever numa célula protegida e gostaria que isso não acontecesse. O que não estou a conseguir é apagar um dado do Range("G7:Z7") e consequente também da tab "SETTINGS".

Ou seja se por algum motivo me enganar como faço para apagar o valor da tab DATA e da tab SETTINGS, já que a planilha está protegida?

Obrigado
Jorge
Você não está autorizado a ver ou baixar esse anexo.
#63912
no VBA vc poderia dar um unprotect, alterar o que vc quiser, e dar um protect novamente.
Eu fiz algo parecido para atualizar uma tabela dinâmica protegida via VBA neste video :
https://www.youtube.com/watch?v=_w2UePw1z6k
JCabral agradeceu por isso
#63929
oi, boa noite, acredito que consegui o que vc precisa, vou explicar abaixo detalhadamento.
nas macros, onde eu alterei coloquei o comentário 'curso de excel gratis para vc achar mais fácil.

Os dois problemas foram bem complicados de resolver !
Para o Delete funcionar mesmo com a tabela protegida eu usei o onKey.

Esse onKey é muito legal, vou usar ele para fazer aquele jogo de snake no excel nos meus videos do youtube.

O que ele faz ? ele pega uma tecla pressionada e substitui por uma chamada de macro, o que eu não sabia é que ele fazia isso na planilha protegida também, então foi bem legal descubrir isso.
E outra coisa que eu não sabia é que dava para passar parâmetros para a macro, neste caso tive que passar a linha e coluna que quero apagar.

Fiz da seguinte forma, no evento selection change coloquei isto :


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'curso de excel gratis
If Target.Column >= 4 And Target.Column <= 23 And Target.row = 7 Then 'verifica que esteja na faixa cinza de células
'associa o delete a macro deletevalue, nessa macro eu desprotego a célula antes de deletar
Application.OnKey "{DELETE}", "'DeleteValue """ & Target.row & """ , """ & Target.Column & """'"
Else
'volta o uso normal do delete
Call Application.OnKey("{DELETE}")

End If
End Sub

esse jeito maluco de chamar o on key é para passar os parâmetros, uma outra forma poderia ter sido criando variaveis globais com a linha e a coluna, também daria certo. ( Achei aqui como passar parâmetros no on key https://excelfox.com/forum/showthread.p ... -Parameter )

e na macro deletevalue basicamente é isto

Public Sub DeleteValue(ByVal row As Integer, ByVal col As Integer)
'curso de excel gratis
'
DesprotegerData
Cells(row, col).ClearContents
protegerData

End Sub

Tem essas duas subs de proteger e desproteger para poder organizar o código.

Isso resolveu o delete, para resolver o outro, foi um pouco mais chato, pois não entendia pq dava o erro, então tive a ideia de desproteger totalmente a planilha e ver o que acontecia.

Você está chamado o form dentro do evento Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Antes do double click, o que acontece é que depois que abre o form, e o usuário seleciona o valor e vc fecha o form, vc ainda está dentro do evento beforedoubleclick , então ele vai finalizar o evento e vai ficar no modo de edição de célula, so que como protegemos a célula antes de fechar o form, ele da o erro.
O segredo é "cancelar" o evento beforedoubleclick antes dele terminar, para fazer isso vc coloca no final
Cancel = true
com isso o cursor não fica mais piscando no final e não da o erro mesmo depois de bloquear.
Você não está autorizado a ver ou baixar esse anexo.
JCabral agradeceu por isso
#63956
neste caso, como não da para passar um range inteiro por parametro ( eu acho, talvez até de ... ) eu criei uma variável global e uso essa variável para limpar tudo, o ideal seria ter removido os parametros da função visto que não vamos usar mais.

segue anexo a planilha atualizada
Você não está autorizado a ver ou baixar esse anexo.
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