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

Comentários

comentários

12 thoughts on “Impedir Copiar / Colar no Excel com VBA”

  1. 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.

  2. 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

  3. 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

  4. 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

  5. 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.

  6. 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

  7. 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.

Comments are closed.