Impedir Copiar / Colar no Excel com VBA
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

73 Convidados
2 Bots
novembro 8th, 2008 at 19:22
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.
novembro 11th, 2008 at 16:00
como posso obter em vba a última celula com valor dentro.
novembro 13th, 2008 at 10:26
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
novembro 13th, 2008 at 12:25
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
agosto 11th, 2009 at 13:36
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
agosto 11th, 2009 at 16:58
Diego,
Responderei a perguntas no fórum a partir de agora:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
agosto 21st, 2009 at 17:18
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.
agosto 21st, 2009 at 18:21
Edson,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
outubro 20th, 2009 at 20:23
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
outubro 20th, 2009 at 20:46
Marcio,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas
janeiro 19th, 2011 at 18:53
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.
janeiro 19th, 2011 at 21:21
Olá Douglas,
É um caso propício para nosso fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Abraços
Tomás