Não é raro ver essa necessidade em fóruns de Excel que frequento. Por isso, coloco abaixo uma possível solução.
O código abaixo impede via VBA que o usuário utilize a funcionalidades Copiar e Colar no Microsoft Excel. De quebra, ainda desabilita os botões copiar, e recortar das barras de ferramenta padrão do Excel.
Especificamente, o código trata os principal evento de navegação entre células, desativando o contexto CutCopyMode, o que faz com que a marcação do copiar e consequentemente a opção de colar do usuário. Para não atrapalhar o funcionamento de outras planilhas, o código trata também os eventos Workbook_Activate e Workbook_Deactivate, reativando o contexto e os botões das operações em questão.
Todo o código deve ser colocado no módulo EstaPasta_de_Trabalho no VBA (ThisWorkbook em inglês).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Private Sub Workbook_Activate() Dim oCtrl As Office.CommandBarControl 'Desabilita todos os comandos de Recortar For Each oCtrl In Application.CommandBars.FindControls(ID:=21) oCtrl.Enabled = False Next oCtrl 'Desabilita todos os comandos de Copiar For Each oCtrl In Application.CommandBars.FindControls(ID:=19) oCtrl.Enabled = False Next oCtrl Application.CellDragAndDrop = False End Sub Private Sub Workbook_Deactivate() Dim oCtrl As Office.CommandBarControl 'Habilita todos os comandos de Recortar For Each oCtrl In Application.CommandBars.FindControls(ID:=21) oCtrl.Enabled = True Next oCtrl 'Desabilita todos os comandos de Copiar For Each oCtrl In Application.CommandBars.FindControls(ID:=19) oCtrl.Enabled = True Next oCtrl Application.CellDragAndDrop = True End Sub Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) With Application .CellDragAndDrop = False .CutCopyMode = False 'limpa a área de transferência End With End Sub |
Nem preciso dizer que é preciso ativar as macros para a que o código funcione. Também não preciso lembrar que não ha como ativar as macros automaticamente, a não ser que utilize o recursos de certificados digitais do Office.
Abraços
Tomás Vásquez
http://www.tomasvasquez.com.br
Tomás achei interessante seu post de como impedir pra copiar/colar no excel com VBA, entretanto, ele só funciona quando se tenta copiar/colar dentro do mesmo arquivo, ou seja, se quiser copiar o conteudo de uma planilha, abro outro arquivo e colo na nova planilha. Você já tinha previsto isso? tem outra solução? Agradeço a atenção.
Obrigado,
Rudge M.M.
como posso obter em vba a última celula com valor dentro.
Willian,
Depende muito do que quer dizer com “última célula”.
De qualquer forma, a propriedade UsedRange do objeto Worksheet devolve o número de colunas e linhas ocupadas na planilha da seguinte forma:
Sheet1.UsedRange.Rows.Count ‘devolve o número de linhas ocupadas
Sheet1.UsedRange.Columns.Count ‘devolve o número de colunas ocupadas
Abraços
Rudge,
Entendo, mas aí o código deveria estar implementado nas duas planilhas. Até é possível de fazer da forma que precisa, mas seria necessário mapear os eventos de todas as planilhas abertas toda vez em que houvesse um troca de contexto entre arquivos, o que envolveria tratar eventos da aplicação, o que deixa a solução muito mais complicada.
Creio que a primeira alternativa ainda é a melhor escolha.
Abraços
Olá,
Gostaria de saber se há alguma maneira de eu inserir este codigo em PLANILHAS ESPECIFICAS, como por exemplos PLAN1.
Desde já agradeço.
Diego
Diego,
Responderei a perguntas no fórum a partir de agora:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
Tomaz é possível bloquear também a tecla Prt Sc?Você conhece alguma forma de fazer atraves de VBA?
Caso conheça favor entrar em contato por e-mail.
Um grande abraço e parabéns pelo site.
Edson,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
Olá, Tomaz
Estou com umas dúvidas referente a um evento no VBA, pode me ajudar?
Fiz uma macro onde seleciono a Range do meu relatório e inputo (colo) em um relatório consolidado, a minha dificuldade é a seguinte:
Como o relatório é utilizado por varios usuarios, gostaria de colar as informações na primeira celula vazia da primeira coluna, ou seja, abaixo da linha da ultima informação inputada,
Abraço
Marcio,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
Gostei do post,
Porém estou precisando de uma ajuda
gostaria de um código para identificar se há dados na área de tranferência, pois tenho um planilha que copio dados para colar, gostaria de identificar se á area de transferência estiver vazia exibir uma mensagem de erro para o usuário da planilha.
Obs: para qualquer tipo de dados copiados figuras textos etc.
Olá Douglas,
É um caso propício para nosso fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Abraços
Tomás